我有一个 AWS Database Migration Service (AWS DMS) 任务处于完全加载完成或复制正在进行的迁移阶段。但是,目标数据库中的数据与源数据库中的数据不匹配。
简短描述
当您使用 AWS DMS 在异构环境中迁移数据时,可能会出现数据不匹配的情况,原因如下:
- 大型二进制对象 (LOB) 设置不正确
- 不支持源或目标数据类型
- 更改数据捕获 (CDC) 复制期间发生的错误或异常会导致目标数据库的数据操作语言 (DML) 事务失败
如果您未使用正确的 LOB 设置,则会根据 LobMaxSize 任务设置截断数据。因此,目标 LOB 列不包含与源完全相同的数据。
在异构迁移期间,AWS DMS 将源数据类型转换为内部数据类型。然后,AWS DMS 将内部数据转换为目标数据类型。由于 AWS DMS 不完全支持某些源和目标数据类型,因此您可能会看到源和目标之间的数据不匹配。
解决方法
进行初步检查
如果您使用仅完全加载的任务,请确保迁移已完成且任务处于停止状态。
如果您使用完全加载和 CDC 任务或仅 CDC 的任务,请查看 CDCLatencySource 和 CDCLatencyTarget Amazon CloudWatch 指标。确认没有延迟。
检查是否没有其他应用程序连接到源数据库或目标数据库,因为这可能会导致数据操作。例如,如果您正在运行仅完全加载的任务,并且源日期被另一个应用程序修改,则目标端的数据不匹配。或者,如果另一个应用程序将数据写入目标数据库上迁移的目标表,则目标和源之间存在数据不匹配的情况。
查询目标上的 awsdms_validation_failures_v1 表
如果您的目标是数据一致性,请在创建 AWS DMS 任务时开启验证。
**注意:**如果表有 LOB 列并且您使用受限 LOB 模式进行迁移,则必须将 ValidationPartialLobSize 设置为与 LobMaxSize 相同的值。
开启验证时进行故障排除
如果开启了验证,请检查目标数据库中的 awsdms_Validation_failures_v1 表。如果记录在迁移期间进入 ValidationSuspended 或 ValidationFailed 状态,则 AWS DMS 会将诊断信息写入 awsdms_validation_failures_v1。要解决验证错误,请运行类似于以下内容的命令:
select * from awsdms_validation_failures_v1 where TASK_NAME = 'ABC123FGJASHKNA345';
要获取有关失败的信息,请检查输出中的详细信息列。使用密钥列比较源和目标之间的记录数据。有关如何对数据验证问题进行故障排除的详细信息,请参阅故障排除。
关闭验证时进行故障排除
如果您尚未开启对 AWS DMS 任务的验证,请创建仅验证的任务。
对于一次性迁移,使用仅完全加载验证功能快速比较源和目标之间的所有行。
要进行持续复制,请使用仅 CDC 验证的任务。仅 CDC 验证的任务会验证源表和目标表之间的现有行。任务会继续进行持续的更改,并报告数据验证失败。
检查源数据和目标数据是否存在限制
确定不匹配的数据后,检查源和目标是否存在与其数据类型相关的限制。例如,当您使用 PostgreSQL 作为源时,你无法迁移 ENUM 数据类型。
检查任务日志中是否有错误
在验证失败时检查任务日志中是否存在错误。或者,检查控制表以查看在数据复制阶段记录的异常。
解决由截断导致的数据不匹配问题
当您使用受限 LOB 模式时,AWS DMS 会在复制实例中预分配内存。然后,AWS DMS 使用 LobMaxSize 任务设置来批量加载 LOB 数据。AWS DMS 会截断超过最大 LOB 大小的 LOB,然后向日志文件发出警告消息。
检查日志文件中是否有显示数据被截断的警告消息,然后检查相应的 LOB 列的最大大小。定义大于 LOB 列大小的 LobMaxSize,以便数据不会被截断。使用诊断支持脚本查找包含 LOB 数据的表,然后查询 LOB 列的大小。
如果 LOB 列的最大大小超过 100 MB,请使用完整 LOB 或内联 LOB 模式停止 LOB 列数据截断。
相关信息
仅验证的任务
在 AWS DMS 任务中为源数据库设置 LOB 支持