Comment résoudre le problème lié à l'échec d'une tâche AWS DMS qui provoque une erreur de violation de contrainte de clé étrangère ?

Date de la dernière mise à jour : 02/10/2019

Une tâche AWS Database Migration Service (AWS DMS) que j'exécute échoue en provoquant une erreur de violation de contrainte de clé étrangère. Quelle est l'origine de cette erreur et comment l'éliminer ?

Brève description

Par défaut, les tâches AWS DMS chargent huit tables à la fois pendant la phase de chargement complet. Par défaut, ces tables sont chargées par ordre alphabétique si vous ne configurez pas l'ordre de chargement de la tâche. Pour plus d'informations, consultez la section Ordre de chargement des tables pendant le chargement complet dans AWS Database Migration Service accélère la migration en ajoutant la prise en charge du chargement complet parallèle et de nouveaux mécanismes de migration LOB.

Si l'ordre de chargement n'est pas configuré pour charger les tables parentes en premier, une table enfant peut être chargée avant sa table parente. Dans ce cas, la tâche échoue en provoquant une erreur de violation de contrainte de clé étrangère et en générant des entrées de journal similaires à ce qui suit :

Messages
[TARGET_LOAD] E : RetCode : SQL_ERROR SqlState : 0A000 NativeError : 1 Message: ERROR: cannot truncate a table referenced in a foreign key constraint; Error while executing the query [1022502] (ar_odbc_stmt.c:4622) (Message 1 : ERREUR : ne peut pas tronquer une table référencée dans une contrainte de clé étrangère ; Erreur lors de l'exécution de la requête [1022502] (ar_odbc_stmt.c : 4622))
[TARGET_LOAD] E : RetCode : SQL_ERROR SqlState : HY000 NativeError : 1217 Message: [MySQL][ODBC 5.3(w) Driver][mysqld-5.7.23-log]Cannot delete or update a parent row: a foreign key constraint fails [1022502] (ar_odbc_stmt.c:4615) (Message 1217 : [MySQL] [Pilote ODBC 5.3 (w)] [mysqld -5.7.23-log] Impossible de supprimer ou de mettre à jour une ligne parente : une contrainte de clé étrangère échoue [1022502] (ar_odbc_stmt.c : 4615)

La réplication continue utilise le mode Transactional Apply (Application transactionnelle) qui applique les transactions dans le même ordre de validation que la source. Lorsque la tâche se trouve dans la phase de réplication continue, vous pouvez activer les contraintes de clé étrangère sur la cible. Si vous utilisez le mode Batch Apply (Application par lots) pour la réplication continue, les clés étrangères doivent être désactivées, même pendant la phase de capture des données modifiées (CDC).

Solution

Pour éliminer cette erreur :

  • Désactiver les contraintes de clé étrangère
  • Utiliser le mode Drop tables on target (Supprimer les tables sur la cible)

Désactiver les contraintes de clé étrangère

Si la cible est une base de données compatible MySQL, vous pouvez utiliser des attributs de connexion supplémentaires pour désactiver les contraintes de clé étrangère :

initstmt=SET FOREIGN_KEY_CHECKS=0

Si la cible est une base de données compatible PostgreSQL, des erreurs de violation de clé étrangère se produisent au cours de la phase CDC. Pour éliminer cette erreur, affectez au paramètre session_replication_role la valeur replica.

Pour les autres moteurs de base de données, désactivez ou « supprimez » manuellement les contraintes de clé étrangère.

Utiliser le mode Drop Tables on taget (Supprimer les tables sur la cible)

Lorsque vous utilisez le mode Drop tables on target (Supprimer les tables sur la cible) (paramètre de tâche DROP_AND_CREATE), AWS DMS crée uniquement les objets nécessaires pour qu'un chargement complet réussisse sur la cible. Toutefois, si vous utilisez le mode Drop tables on target (Supprimer les tables sur la cible), vous devez créer manuellement d'autres objets qui ne sont pas créés par AWS DMS, tels que les index secondaires, les valeurs par défaut de données et les déclencheurs.


Cet article vous a-t-il été utile ?

Cette page peut-elle être améliorée ?


Vous avez besoin d'aide ?