AliSQL étend MySQL 8.0 communautaire pour prendre en charge la modification instantanée des types de colonnes. Au lieu de copier l'intégralité des données de la table, cette opération modifie uniquement les métadonnées et s'exécute en quelques secondes, quelle que soit la taille de la table.
MySQL 8.0 communautaire utilise le mécanisme INSTANT DDL pour ajouter et supprimer des colonnes, évitant ainsi la copie des données. Toutefois, pour modifier les types de colonnes, il recourt au mécanisme COPY DDL, qui réécrit la table entière. AliSQL étend le framework INSTANT DDL aux changements de type de colonne en appliquant la même approche basée exclusivement sur les métadonnées.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Une instance ApsaraDB RDS for MySQL exécutant MySQL 8.0 avec une version mineure du moteur 20251031 ou ultérieure
Si votre instance ne répond pas à cette exigence, effectuez d'abord une mise à niveau :
Limites
| Contrainte | Détails |
|---|---|
| Moteur de stockage | InnoDB uniquement |
| Colonnes indexées | La modification des colonnes indexées n'est pas prise en charge |
| Colonnes de clé de partitionnement | La modification des colonnes incluses dans une clé de partitionnement n'est pas prise en charge |
| Modifications d'entiers prises en charge | Élargissement uniquement : TINYINT → SMALLINT → MEDIUMINT → INT → BIGINT. Par exemple, la conversion de INT vers BIGINT est prise en charge, tandis que celle de BIGINT vers INT ne l'est pas |
| Modifications de chaînes prises en charge | Augmentation de la longueur des colonnes CHAR et VARCHAR uniquement. Pour passer de CHAR(M) à CHAR(N), N doit être supérieur à M |
Paramètres
Trois paramètres contrôlent cette fonctionnalité. Ils doivent tous être définis sur ON pour activer la modification instantanée du type de colonne.
| Paramètre | Description | Portée | Valeur par défaut |
|---|---|---|---|
loose_rds_upgrade_datatype_instant_enable |
Active la modification instantanée du type de colonne | Globale | OFF |
loose_rds_upgrade_datatype_online_enable |
Active la modification en ligne du type de colonne | Globale | OFF |
loose_innodb_instant_ddl_enabled |
Interrupteur principal pour INSTANT DDL | Globale | ON |
Ces trois paramètres sont booléens, acceptent les valeurs ON ou OFF, et ne nécessitent pas de redémarrage de l'instance.
Activer les paramètres
Accédez à la page Instances. Dans la barre de navigation supérieure, sélectionnez la région où se trouve votre instance RDS. Localisez l'instance et cliquez sur son ID.
Dans le volet de navigation de gauche, cliquez sur Parameter Settings.
Sous l'onglet Modifiable Parameters, recherchez chaque paramètre et définissez sa valeur sur
ON.Cliquez sur OK, puis sur Submit Parameters. Dans la fenêtre qui s'affiche, sélectionnez une plage horaire pour l'application des modifications.
Modifier instantanément les types de colonnes
Les exemples ci-dessous utilisent la table suivante :
CREATE TABLE `t1` (
`id` int NOT NULL,
`c1` char(10) DEFAULT NULL,
`c2` varchar(10) DEFAULT NULL,
`c3` char(100) DEFAULT NULL,
`c4` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Tous les exemples utilisent ALGORITHM=INSTANT pour exécuter la modification en tant qu'opération portant uniquement sur les métadonnées.
Modifier un type de colonne
Modifiez c1 de char(10) vers bigint :
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL, ALGORITHM=INSTANT;
Étendre la longueur d'une chaîne
Étendez la longueur de c2 (VARCHAR) et c3 (CHAR) :
ALTER TABLE `t1` MODIFY `c2` char(20) DEFAULT NULL, ALGORITHM=INSTANT;
ALTER TABLE `t1` MODIFY `c3` varchar(100) DEFAULT NULL, ALGORITHM=INSTANT;
Laisser le système choisir l'algorithme
Omettez ALGORITHM= : le système sélectionnera automatiquement l'algorithme le plus approprié pour modifier le type de colonne.
ALTER TABLE `t1` MODIFY `c1` bigint DEFAULT NULL;
La spécification de ALGORITHM=INPLACE exécute la modification en ligne (méthode in-place), et non de manière instantanée.
Vérifier la modification
Pour confirmer qu'une colonne a été modifiée instantanément, interrogez la vue INFORMATION_SCHEMA.INNODB_COLUMNS. Les colonnes modifiées instantanément affichent une valeur PARENT_PHYSICAL_POSITION différente de -1 ; les colonnes normales affichent -1.
Étape 1 : Obtenez l'ID de la table depuis la vue INFORMATION_SCHEMA.INNODB_TABLES :
SELECT * FROM INFORMATION_SCHEMA.INNODB_TABLES WHERE NAME = 'demo/t1';
Exemple de sortie :
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
| TABLE_ID | NAME | FLAG | N_COLS | SPACE | ROW_FORMAT | ZIP_PAGE_SIZE | SPACE_TYPE | INSTANT_COLS | TOTAL_ROW_VERSIONS | INITIAL_COLUMN_COUNTS | CURRENT_COLUMN_COUNTS | TOTAL_COLUMN_COUNTS |
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
| 2197 | demo/t1 | 33 | 7 | 1129 | Dynamic | 0 | Single | 0 | 3 | 4 | 4 | 7 |
+----------+---------+------+--------+-------+------------+---------------+------------+--------------+--------------------+-----------------------+-----------------------+---------------------+
1 row in set (0.00 sec)
Étape 2 : Interrogez les détails des colonnes en utilisant l'ID de la table :
SELECT * FROM INFORMATION_SCHEMA.INNODB_COLUMNS WHERE TABLE_ID = 2197;
Exemple de sortie :
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
| TABLE_ID | NAME | POS | MTYPE | PRTYPE | LEN | HAS_DEFAULT | DEFAULT_VALUE | VERSION_ADDED | VERSION_DROPPED | PHYSICAL_POS | VERSION_MODIFIED | PARENT_PHYSICAL_POSITION |
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
| 2197 | id | 0 | 6 | 1283 | 4 | 0 | NULL | 0 | 0 | 0 | 0 | -1 |
| 2197 | c1 | 1 | 6 | 1032 | 8 | 1 | NULL | 1 | 0 | 6 | 0 | 3 |
| 2197 | c2 | 2 | 13 | 2162942 | 60 | 1 | NULL | 2 | 0 | 7 | 0 | 4 |
| 2197 | c3 | 3 | 12 | 2166799 | 300 | 1 | NULL | 3 | 0 | 8 | 0 | 5 |
+----------+------+-----+-------+---------+-----+-------------+---------------+---------------+-----------------+--------------+------------------+--------------------------+
4 rows in set (0.02 sec)
Dans cette sortie, les colonnes c1, c2 et c3 affichent respectivement des valeurs PARENT_PHYSICAL_POSITION de 3, 4 et 5, ce qui confirme qu'elles ont été modifiées instantanément. La colonne id affiche -1, indiquant qu'il s'agit d'une colonne normale (non modifiée instantanément).
Si PARENT_PHYSICAL_POSITION est égal à -1 pour une colonne que vous pensiez avoir modifiée instantanément, le système est revenu à l'algorithme COPY ou INPLACE. Vérifiez que les trois paramètres requis sont définis sur ON et que la colonne respecte les exigences de type et de contrainte prises en charge.