L'exécution d'opérations de langage de définition de données (DDL) en ligne sur une base de données source pendant une tâche de fusion de tables entraîne une perte de données dans la base de données de destination. Pour éviter ce problème, excluez les opérations DDL en ligne de la configuration de la tâche ou abstenez-vous de les exécuter sur la base de données source pendant la durée de la tâche.
Fonctionnement
Une tâche de fusion de tables consolide les tables provenant de plusieurs bases de données sources et synchronise ou migre les données vers une seule table de destination.
Par exemple, si vous configurez une tâche pour fusionner les tables de deux bases de données ApsaraDB RDS for MySQL (Base de données 1 et Base de données 2) dans la base de données de destination, DTS mappe les données comme suit :
Table A1 (Base de données 1) → Table A (destination)
Table A2 (Base de données 2) → Table A (destination)
Si la table A1 contient 100 enregistrements et la table A2 en contient 200, la table A de la base de données de destination devrait contenir 300 enregistrements après la fusion.
Pourquoi les opérations DDL en ligne provoquent une perte de données
Les opérations DDL en ligne fonctionnent en créant une table temporaire, en y appliquant les modifications de schéma, puis en utilisant RENAME TABLE pour remplacer la table originale par la table temporaire. La séquence des opérations est la suivante :
-
Créez une table temporaire :
CREATE TABLE tmp_table_table LIKE table_name -
Modifiez le schéma de la table temporaire :
ALTER TABLE tmp_table_table XXXX -
Copiez les données historiques vers la table temporaire :
INSERT IGNORE INTO tmp_table_table (SELECT %s FROM table_name FORCE INDEX (%s) WHERE xxx -
Synchronisez les données incrémentielles via les journaux binaires :
UPDATA/INSERT/DELETE tmp_table_name -
Basculez les charges de travail vers la table temporaire :
RENAME TABLE table_name to old_tmp_table_table, tmp_table_name to table_name
Une fois ces opérations effectuées, les données de la table A1 de la Base de données 1 écrasent celles de la table A dans la base de données de destination. Par conséquent, les données de la table A2 de la Base de données 2 sont perdues.
Pour plus d'informations sur les opérations DDL en ligne, consultez
Effectuer des opérations DDL sans verrou
.
Solution
Pour éviter toute perte de données, utilisez l'une des approches suivantes :
| Approche | Description |
|---|---|
| Exclure les opérations DDL en ligne de la tâche | Lors de la configuration de la tâche de synchronisation des données, ne sélectionnez pas l'option permettant de synchroniser les opérations DDL en ligne. |
| Éviter les opérations DDL en ligne sur les bases de données sources | N'exécutez pas d'opérations DDL en ligne sur les bases de données sources tant que la tâche de fusion de tables est en cours d'exécution. |