如何解决 AWS DMS 任务因违反外键约束错误而失败的问题?

1 分钟阅读
0

我有一个 AWS Database Migration Service (AWS DMS) 任务因违反外键约束而失败。

简短描述

默认情况下,AWS DMS 任务可在全量加载期间一次加载八个表。除非为该任务配置了加载顺序,否则在默认情况下,会按字母顺序加载这些表。有关更多信息,请参阅 AWS 数据库迁移服务可通过增加对并行全量加载和新 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 参数设置为副本。为此,请向端点添加额外的连接属性 afterConnectScript=SET session_replication_role='replica'。或者,使用 AWS 命令行界面将端点设置添加到目标端点。

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

**注意:**如果您在运行 AWS CLI 命令时收到错误,请确保您使用的是最新版本的 AWS CLI

使用“删除目标数据库的表”模式

当您使用删除目标数据库的表模式时,AWS DMS 仅创建在目标数据库上成功进行全量加载所必需的对象。AWS DMS 也将其称为 DROP_AND_CREATE 任务设置。但是,如果您使用的是删除目标数据库的表模式,则必须在 AWS DMS 以外手动创建其他对象。其中包括二级索引、数据默认值和触发器等对象。

相关信息

使用任务日志解决迁移问题

AWS 官方
AWS 官方已更新 1 年前
没有评论