如何排查 AWS DMS 任务失败并显示“外键约束冲突”错误的问题?

上次更新时间:2019 年 10 月 2 日

我有一个 AWS Database Migration Service (AWS DMS) 的任务失败,并显示“外键约束冲突”错误。为什么会收到此错误,又该如何解决此问题?

简短描述

默认情况下,AWS DMS 任务会在完整加载阶段一次性加载八个表。除非您为任务配置了加载顺序,否则这些表将默认按字母顺序加载。有关更多信息,请参阅 AWS Database Migration Service 通过增加并行完整加载支持和新的 LOB 迁移机制提高迁移速度一文中的完整加载期间的表加载顺序部分。

如果未将加载顺序配置为首先加载父表,则可能会在父表之前加载子表。这将会导致任务失败并显示外键约束冲突错误以及与以下类似的日志条目:

消息
[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)
[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)

持续复制使用事务应用模式,这将会按照与源相同的提交顺序执行事务。如果任务处于持续复制阶段,您可以在目标上启用外键约束。如果持续复制使用批量应用模式,则必须禁用外键,即使在更改数据捕获 (CDC) 阶段也必需禁用。

解决方法

要解决此错误,请执行以下任何一种操作方法:

  • 禁用外键约束
  • 使用删除目标上的表模式

禁用外键约束

如果目标是兼容 MySQL 的数据库,则可以使用额外的连接属性来禁用外键约束:

initstmt=SET FOREIGN_KEY_CHECKS=0

如果目标是兼容 PostgreSQL 的数据库,则您可能会在 CDC 阶段看到外键冲突错误。要解决此错误,请将 session_replication_role 参数设置为复制

对于其他数据库引擎,请手动禁用或“删除”外键约束。

使用“删除目标上的表”模式

使用删除目标上的表模式(DROP_AND_CREATE 目标 设置)时,AWS DMS 将仅创建在目标上成功执行完整加载需要的对象。但如果您使用删除目标上的表模式,则必须手动创建 AWS DMS 未创建的其他对象,例如二级索引、数据默认值和触发条件。


这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助吗?