如何解决 AWS DMS 中源数据库和目标数据库之间的数据不匹配问题?

上次更新日期:2022 年 9 月 12 日

我有一个 AWS Database Migration Service (AWS DMS) 任务处于完全负载完成或复制正在进行的迁移阶段。但是,目标数据库中的下游数据与源数据库上的数据不匹配。如何解决源数据库和目标数据库之间的数据不匹配问题?

简短描述

使用 AWS DMS 在异构环境中迁移数据时,可能会出现数据不匹配的原因有很多。例如:

  • 如果您没有使用正确的 LOB 设置,则会根据 MaxLobSize 任务设置截断数据。因此,目标 LOB 列不包含与源完全相同的数据。
  • 在异构迁移期间,AWS DMS 会将源数据类型转换为内部数据类型。然后,AWS DMS 会将内部数据转换为目标数据类型。但是,由于 AWS DMS 不完全支持某些源数据类型和目标数据类型,您可能会发现源和目标之间的数据不匹配。
  • 如果在更改数据捕获 (CDC) 复制期间出现任何错误或异常,则目标数据库的 DML 事务可能会失败。

解决方法

在进行故障排除之前执行初步检查

在使用本文中的步骤对问题进行故障排除之前,请执行以下初始检查:

  • 如果您使用的是仅限完全加载的任务,请确保迁移已完成,并且任务已进入停止状态。
  • 如果您使用的是满负载或仅限 CDC 的任务,请查看 CDCLatencySource 和 CDCLatencyTarget Amazon CloudWatch 指标。确认您没有观察到任何延迟。
  • 确认没有其他应用程序连接到源数据库或目标数据库。这可能会导致数据操纵。例如,如果您正在运行仅限完全加载的任务,并且源上的数据被其他应用程序修改,则可能会在目标位置看到数据不匹配。或者,如果目标数据库具有 DML 触发器,或者其他应用程序将数据写入迁移的目标表,您还会看到目标和源之间的数据不匹配。

查询目标上的 awsdms_validation_failures_v1 表

如果数据一致性是您的主要目标,请务必在创建 AWS DMS 任务时启用验证。

开启验证时进行故障排除

如果启用了验证,则可以检查目标数据库中的 AWSDMS_Validation_Failures_v1 表。如果任何记录在迁移过程中进入 ValidationSuspended 或 ValidationFailed 状态,则 AWS DMS 会将诊断信息写入 awsdms_validation_failures_V1。查询此表,通过运行类似如下的命令来排除验证错误:

select * from awsdms_validation_failures_v1 where TASK_NAME = 'ABC123FGJASHKNA345';

检查输出中的详细信息列以获取有关故障的信息。使用 Key 列比较源和目标之间的记录数据。有关更多信息,请参阅 AWS DMS 数据验证文档的故障排除部分。

验证关闭时进行故障排除

如果您尚未开启对 AWS DMS 任务的验证,请创建仅限验证的任务:

  • 对于一次性迁移,请使用仅限完全加载验证功能快速比较源和目标之间的所有行。
  • 对于正在进行的复制,请使用 CDC 仅限验证的任务。CDC 仅限验证的任务将验证源表和目标表之间的现有行。任务继续进行持续的更改,并报告任何数据验证失败。

检查源数据和目标数据中的限制

确定不匹配的数据后,请检查源和目标是否存在与其数据类型相关的限制。例如,当你使用 PostgreSQL 作为源时,你无法迁移 ENUM 数据类型。

检查任务日志中的错误

验证失败时,请检查任务日志中是否存在错误。或者,检查控制表以查看在数据复制阶段是否记录了任何异常。

解决因截断而导致的数据不匹配

当您使用有限的 LOB 模式时,AWS DMS 会在复制实例中预分配内存。然后,它使用 LoBMaxSize 任务设置批量加载 LOB 数据。AWS DMS 会截断超过最大 LOB 大小的任何 LOB,然后向日志文件发出警告。

检查日志文件中是否有指示数据被截断的警告消息,然后检查相应的 LOB 列的最大长度。定义一个大于 LOB 列长度的 LOBMaxSize,这样数据就不会被截断。使用诊断支持脚本找出哪些表包含 LOB 数据,然后进行相应的查询。

如果 LOB 列的最大大小超过 100 MB,则使用完整 LOB 或内联 LOB 模式停止 LOB 列数据截断。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?