MySQL standard utilise l'algorithme COPY pour modifier le type de données d'une colonne. Cette méthode reconstruit intégralement la table sur un seul thread et bloque toutes les écritures. Pour les tables volumineuses, cette opération peut durer de plusieurs minutes à quelques heures. La fonctionnalité Instant Modify Column de PolarDB for MySQL évite cette contrainte en mettant à jour uniquement les métadonnées de la table. L'opération s'exécute ainsi en quelques secondes, quelle que soit la taille de la table.
Instant Modify Column est disponible en version canary. Pour utiliser cette fonctionnalité, accédez au Quota Center , recherchez le quota polarm_82_instant_modify_column , puis cliquez sur Apply .
Versions prises en charge
PolarDB for MySQL 8.0.2, version de révision 8.0.2.2.28 ou ultérieure. Vérifiez la version de votre moteur de base de données avant de commencer.
Paramètres
| Paramètre | Niveau | Description | Valeur par défaut |
|---|---|---|---|
loose_innodb_polar_instant_modify_column_enable |
Global | Active ou désactive Instant Modify Column. Valeurs valides : ON, OFF |
OFF |
loose_innodb_polar_instant_modify_column_max_times |
Global | Nombre maximal de modifications de types de colonnes autorisées par cette fonctionnalité sur une même table. Plage : 1–64 | 16 |
Opérations prises en charge
Instant Modify Column prend uniquement en charge l'augmentation de la longueur des colonnes pour les types de données suivants. Consultez ce tableau pour vérifier la compatibilité de votre opération avant de l'exécuter.
| Type de colonne | Modification prise en charge | Exemple pris en charge | Exemple non pris en charge |
|---|---|---|---|
TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT |
Passage à un type entier plus large | INT → BIGINT |
BIGINT → INT |
VARCHAR(N) |
Augmentation de la longueur (N vers N+M, où M > 0) |
VARCHAR(50) → VARCHAR(300) |
VARCHAR(300) → VARCHAR(50) |
CHAR(N) |
Augmentation de la longueur (N vers N+M, où M > 0) |
CHAR(30) → CHAR(50) |
CHAR(50) → CHAR(30) |
Les restrictions supplémentaires suivantes s'appliquent également :
| Restriction | Détails |
|---|---|
| Format de ligne | Formats de ligne COMPACT ou DYNAMIC uniquement |
| Colonnes indexées | Modification impossible pour les colonnes disposant d'un index |
| Tables partitionnées | Modification impossible pour les colonnes des tables partitionnées |
| Index full-text ou spatiaux | Modification impossible pour les colonnes des tables contenant des index full-text ou spatiaux |
| DDL combinées | Combinaison d'Instant Modify Column avec d'autres opérations DDL dans la même instruction interdite |
Si votre opération ne respecte pas ces conditions et que vous spécifiez ALGORITHM=INSTANT, l'erreur suivante s'affiche :
ERROR 1846 (0A000): ALGORITHM=INSTANT is not supported. Reason: Cannot change column type INPLACE. Try ALGORITHM=COPY/INPLACE
Astuce : Avant d'exécuter une instruction DDL, utilisez EXPLAIN DDL pour vérifier si l'algorithme INSTANT est pris en charge pour cette opération.
Modifier instantanément un type de colonne
Forcer l'algorithme INSTANT (recommandé)
Spécifiez ALGORITHM=INSTANT pour imposer l'utilisation d'Instant Modify Column. Si l'opération ne peut pas utiliser l'algorithme INSTANT, une erreur s'affiche immédiatement au lieu d'un basculement silencieux vers un algorithme plus lent.
CREATE TABLE t(a int);
-- Verify the current table structure
SHOW CREATE TABLE t;
-- Output:
-- CREATE TABLE `t` (
-- `a` int(11) DEFAULT NULL
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- Modify the column type using the INSTANT algorithm
ALTER TABLE t MODIFY COLUMN a bigint DEFAULT NULL, ALGORITHM=INSTANT;
Laisser PolarDB choisir automatiquement l'algorithme
Omettez la clause d'algorithme ou spécifiez ALGORITHM=DEFAULT pour permettre à PolarDB for MySQL de sélectionner automatiquement l'algorithme le plus efficace.
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint, ALGORITHM=DEFAULT;
ALTER TABLE test.test_table MODIFY COLUMN test_column bigint;
PolarDB for MySQL évalue les algorithmes selon l'ordre de priorité suivant :
| Priorité | Algorithme | Comportement |
|---|---|---|
| 1 (la plus élevée) | INSTANT | Met à jour uniquement les métadonnées. L'opération s'achève en quelques secondes, quelle que soit la taille de la table. Aucune reconstruction de table n'est nécessaire. |
| 2 | INPLACE | Autorise les lectures et écritures simultanées pendant l'opération DDL. Le DDL parallèle peut encore accélérer le processus. |
| 3 (la plus basse) | COPY | Reconstruit la table dans son intégralité. La table passe en lecture seule pendant toute la durée de l'opération. |
Consulter les colonnes modifiées instantanément
La table INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS recense toutes les colonnes du cluster actuel modifiées via Instant Modify Column. Seules les colonnes traitées par cette fonctionnalité y figurent.
SELECT * FROM INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
Schéma de la table :
SHOW CREATE TABLE INFORMATION_SCHEMA.INNODB_INSTANT_COLUMNS;
-- CREATE TEMPORARY TABLE `INNODB_INSTANT_COLUMNS` (
-- `TABLE_ID` bigint(21) unsigned NOT NULL DEFAULT '0',
-- `TABLE_NAME` varchar(193) NOT NULL DEFAULT '',
-- `SCHEMA_NAME` varchar(193) NOT NULL DEFAULT '',
-- `COLUMN_NAME` varchar(193) NOT NULL DEFAULT '',
-- `MTYPE` int(11) NOT NULL DEFAULT '0',
-- `PRTYPE` int(11) NOT NULL DEFAULT '0',
-- `LEN` int(11) NOT NULL DEFAULT '0',
-- `HAS_DEFAULT` int(1) NOT NULL DEFAULT '0',
-- `DEFAULT_VALUE` mediumblob,
-- `CURRENT_VERSION` int(11) NOT NULL DEFAULT '0',
-- `OLD_VERSION_INFO` blob
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8
Description des champs :
| Champ | Description |
|---|---|
TABLE_ID |
ID de la table |
TABLE_NAME |
Nom de la table |
SCHEMA_NAME |
Nom du schéma |
COLUMN_NAME |
Nom de la colonne |
MTYPE |
Type de la colonne |
PRTYPE |
Type précis ou attributs de la colonne |
LEN |
Longueur de la colonne |
HAS_DEFAULT |
Indique si la colonne possède une valeur par défaut |
DEFAULT_VALUE |
Valeur par défaut de la colonne |
CURRENT_VERSION |
Informations de version de la colonne |
OLD_VERSION_INFO |
Historique des informations de type de la colonne |
Si vous exécutez une opération DDL nécessitant une reconstruction complète de la table (telle queDROP COLUMN) sur une colonne précédemment modifiée par Instant Modify Column, l'enregistrement correspondant disparaît deINNODB_INSTANT_COLUMNS.