Lors de l'exécution d'instructions DDL sur des tables de données froides stockées dans Object Storage Service (OSS), PolarDB for MySQL sélectionne automatiquement l'algorithme d'exécution le plus efficace. Cette rubrique détaille les deux algorithmes pris en charge (INSTANT et COPY), explique le prérequis OSS META pour le DDL INSTANT et répertorie les opérations associées à chaque algorithme afin de planifier vos modifications DDL sans perturber votre charge de travail.
Prérequis
Avant de commencer, assurez-vous de disposer des éléments suivants :
Un cluster PolarDB for MySQL exécutant MySQL 8.0.2 avec une version de révision 8.0.2.2.23 ou ultérieure
L'archivage des données froides activé sur le cluster. Consultez Activer l'archivage des données froides
Une connexion active au cluster. Consultez Se connecter à un cluster
Des données froides au format CSV (Comma-Separated Values) ou ORC (Optimized Row Columnar)
Fonctionnement
PolarDB for MySQL prend en charge deux algorithmes d'exécution DDL pour les données froides :
Algorithme INSTANT : modifie uniquement les métadonnées du dictionnaire de données. Les données existantes ne sont ni modifiées, ni copiées, ni reconstruites. L'opération s'achève en quelques secondes, quelle que soit la taille de la table. Il s'agit du comportement par défaut ; PolarDB for MySQL l'applique automatiquement lorsqu'il est pris en charge.
COPY algorithm: copie toutes les données de la table vers une nouvelle table. Pendant la copie, la table originale est soumise à un verrou SHARED_NO_WRITE (SNW) : les lectures sont autorisées, mais les écritures sont bloquées. Réservez cet algorithme aux cas où INSTANT n'est pas applicable.
Pour spécifier explicitement un algorithme, utilisez la clause ALGORITHM avec DEFAULT, INSTANT ou COPY. Si l'algorithme spécifié ne prend pas en charge l'opération, une erreur est renvoyée.
Par défaut, PolarDB for MySQL sélectionne INSTANT et ne recourt à COPY que lorsque l'opération nécessite une reconstruction de la table.
Activer OSS META pour utiliser le DDL INSTANT
Une table ne prend en charge le DDL INSTANT que si OSS META est activé. OSS META est une couche de métadonnées améliorée disponible à partir de la version de révision 8.0.2.2.23.
Vérifier si OSS META est activé
Exécutez SHOW CREATE TABLE. Si OSS META=1 apparaît dans la sortie, OSS META est activé.
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
Activer OSS META pour les nouvelles tables
Définissez le paramètre use_oss_meta sur ON. Ce réglage s'applique aux trois scénarios d'archivage : les tables InnoDB non partitionnées archivées vers des tables externes OSS, les tables InnoDB partitionnées archivées vers des tables externes OSS, ainsi que les tables InnoDB archivées vers des partitions OSS.
Vérifiez que le paramètre est actif :
show variables like "use_oss_meta";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| use_oss_meta | ON |
+---------------+-------+
1 row in set (0.03 sec)
Lorsque use_oss_meta est défini sur ON, les tables nouvellement archivées incluent automatiquement le marqueur OSS META. Les exemples suivants illustrent l'apparition de ce marqueur après l'archivage d'une table non partitionnée et d'une table partitionnée :
alter table t engine = csv storage oss;
Query OK, 3 rows affected (2.13 sec)
Records: 3 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
alter table t1 change partition p0 engine = orc;
Query OK, 0 rows affected (1.95 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) DEFAULT NULL,
`name` varchar(20) DEFAULT NULL,
`order_time` datetime DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020223 OSS META=1 */ CONNECTION='default_oss_server'
/*!99990 800020205 PARTITION BY RANGE COLUMNS(id)
(PARTITION p0 VALUES LESS THAN (10) ENGINE = ORC,
PARTITION p1 VALUES LESS THAN (20) ENGINE = InnoDB,
PARTITION p2 VALUES LESS THAN (30) ENGINE = InnoDB,
PARTITION p3 VALUES LESS THAN (40) ENGINE = InnoDB,
PARTITION p4 VALUES LESS THAN (50) ENGINE = InnoDB,
PARTITION p5 VALUES LESS THAN (60) ENGINE = InnoDB,
PARTITION p6 VALUES LESS THAN (70) ENGINE = InnoDB,
PARTITION p7 VALUES LESS THAN (80) ENGINE = InnoDB,
PARTITION p8 VALUES LESS THAN (90) ENGINE = InnoDB,
PARTITION p9 VALUES LESS THAN (100) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (110) ENGINE = InnoDB) */
1 row in set (0.00 sec)
Activer OSS META pour les tables existantes
Exécutez REPAIR TABLE pour ajouter OSS META à une table existante :
repair table t;
+--------+--------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------+--------+----------+----------+
| test.t | repair | status | OK |
+--------+--------+----------+----------+
1 row in set (0.84 sec)
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */ /*!99990 800020223 OSS META=1 */
1 row in set (0.00 sec)
Pendant l'exécution de REPAIR TABLE, un verrou X bloque la table. Toute interrogation ou modification est alors impossible. La durée d'exécution dépend de la taille de la table.
Désactiver OSS META
Exécutez ALTER TABLE ... DISABLE OSS META pour supprimer le marqueur OSS META :
alter table t disable oss meta;
Query OK, 0 rows affected (0.04 sec)
Records: 0 Duplicates: 0 Warnings: 0
show create table t \G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE `t` (
`id` varchar(1000) DEFAULT NULL
) /*!50100 */ /*!99990 800020213 STORAGE OSS */ ENGINE=CSV DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci /*!99990 800020204 NULL_MARKER='NULL' */
1 row in set (0.00 sec)
La modification prend effet immédiatement, sans redémarrage du service de base de données.
Opérations DDL prises en charge
Les tableaux ci-dessous indiquent si chaque opération utilise INSTANT (métadonnées uniquement) ou COPY (reconstruction de la table).
Opérations sur les colonnes
| Opération | Reconstruction de la table | Modification des métadonnées uniquement |
|---|---|---|
| Ajouter une colonne | Non¹ | Oui¹ |
| Supprimer une colonne | Oui | Non |
| Renommer une colonne | Non | Oui |
| Trier les colonnes | Oui | Non |
| Spécifier la valeur par défaut d'une colonne | Non | Oui |
| Modifier le commentaire d'une colonne | Non | Oui |
| Changer le type d'une colonne | Oui | Non |
| Étendre la longueur d'une colonne VARCHAR | Non | Oui |
| Passer le jeu de caractères utf8mb3 d'une colonne à utf8mb4 | Non² | Oui² |
| Supprimer la valeur par défaut d'une colonne | Non | Oui |
| Modifier la valeur d'auto-incrémentation d'une colonne | Non | Oui |
| Définir les valeurs d'une colonne sur NULL | Oui | Non |
| Définir les valeurs d'une colonne sur des valeurs non NULL | Oui | Non |
| Modifier la définition d'une colonne ENUM ou SET | Non | Oui³ |
Note 1 — Ajouter une colonne : la fonctionnalité Instant ADD COLUMN ajoute des colonnes uniquement à la fin d'une table avec OSS META activé. Si la table ne possède pas de clé primaire, définissez implicit_primary_key sur OFF afin d'éviter tout conflit avec une colonne de clé primaire implicite générée automatiquement. Si le cluster ne prend pas en charge Instant ADD COLUMN, utilisez l'algorithme COPY : une reconstruction de la table est alors nécessaire, bien que les lectures simultanées restent autorisées pendant cette opération.
Note 2 — Passage de utf8mb3 à utf8mb4 : le changement du jeu de caractères d'une colonne de utf8mb3 à utf8mb4 ne modifie que les métadonnées lorsque les trois conditions suivantes sont réunies :
Le type de la colonne est CHAR, VARCHAR, ENUM ou TEXT
Aucun index n'est créé sur la colonne
La longueur de stockage maximale de la colonne (avant et après la conversion) reste soit inférieure à 256 octets, soit supérieure à 255 octets
Si l'une de ces conditions n'est pas remplie, l'algorithme COPY est utilisé : la table est verrouillée et seules les lectures sont autorisées pendant la reconstruction. Pour forcer INSTANT et obtenir une erreur immédiate si cet algorithme n'est pas applicable :
ALTER TABLE test modify column b char(1) CHARACTER SET utf8mb4 default null,algorithm = INSTANT;
ERROR 1845 (0A000): ALGORITHM=INSTANT is not supported for this operation. Try ALGORITHM=COPY/INPLACE.
Note 3 — Colonne ENUM ou SET : la modification des métadonnées uniquement s'applique seulement lorsque de nouveaux éléments sont ajoutés à la fin de la colonne ENUM ou SET et que la taille de stockage du type de données reste inchangée. Dans le cas contraire, l'algorithme COPY est utilisé avec une reconstruction complète de la table.
Opérations sur les tables
| Opération | Reconstruction de la table | Modification des métadonnées uniquement |
|---|---|---|
| Activer META | Oui | Non |
| Désactiver META | Non | Oui |
| Déclarer un jeu de caractères | Non | Oui |
| Convertir un jeu de caractères | Oui | Non |
| Renommer une table | Non | Oui¹ |
| Modifier le commentaire d'une table | Non | Oui |
Note 1 — Renommer une table : lors du renommage d'une table stockée dans OSS, les fichiers de données OSS sont renommés plutôt que réécrits. La vitesse d'exécution est proportionnelle à la taille de la table et légèrement inférieure à celle des autres opérations INSTANT qui ne modifient que les métadonnées.