我有一个 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 以外手动创建其他对象。其中包括二级索引、数据默认值和触发器等对象。
相关信息
使用任务日志解决迁移问题