Amazon DMS 数据重新同步
Amazon Database Migration Service(Amazon DMS)数据重新同步可自动修复通过源数据库和目标数据库之间的数据验证发现的数据不一致性。此功能可作为现有 DMS 迁移任务的一部分,确保根据您的任务配置、连接设置、表映射和转换进行适当的更新。
数据重新同步功能的工作原理是:通过从目标数据库上的控制表读取验证失败信息,并执行相应的修复操作。当检测到不匹配时,将使用存储在失败记录中的主键从源端检索当前数据,并在遵守所配置的任何转换的同时将其应用于目标。有关更多信息,请参阅 awsdms_validation_failures_v2 控制表。
行为因迁移类型而异。对于仅完全加载任务,数据重新同步将在初始加载和验证完成后运行一次。对于使用更改数据捕获(CDC)的任务,数据重新同步将根据所配置的时间表运行,在应用修复程序时会暂停复制和验证。
在 CDC 重新同步操作期间:
-
复制和验证暂时暂停。
-
数据重新同步会处理现有的验证失败。
-
恢复正常复制和验证。
-
该过程将根据您配置的时间表重复执行。
数据重新同步会自动跟踪每个修复操作的状态,并通过表格统计数据提供详细的指标。
- 先决条件
-
数据重新同步功能需要以下先决条件:
-
您必须使用 Amazon DMS 引擎版本 3.6.1 或更高版本。
-
必须为正在进行复制的任务配置计划和计时持续时间设置。仅完全加载任务不需要这些设置。
-
限制
数据重新同步功能有以下限制:
-
数据重新同步仅支持 Oracle 和 SQL Server 作为源数据库。
-
数据重新同步支持兼容 PostgreSQL 和 Amazon Aurora PostgreSQL 的引擎作为目标数据库。
-
源数据库和目标数据库中的所有表都必须有主键。验证不支持没有主键或唯一键的表。任何没有有效主键或唯一键的表都将暂停验证,并且不会报告任何验证失败。
-
运行仅完全加载任务时,必须启用数据验证。
-
无法为仅验证任务启用数据重新同步,因为它们不会复制任何数据。您只需提供仅验证
taskID即可在父复制任务上启用重新同步。有关更多信息,请参阅仅验证任务。 -
如果“仅验证”任务在任务设置中配置了
ControlSchema参数,则复制任务也必须具有相同的参数配置,数据重新同步才能找到正确的验证错误。 -
您需要配置 CDC 任务的调度和时长设置。
-
在重新同步时段,数据重新同步可能会影响 DMS 中的复制延迟。
有关在数据重新同步期间排查 Amazon DMS 中的验证问题的更多信息,请参阅 Amazon DMS 数据验证下的故障排除部分。
调度和计时
对于执行 CDC 的任务,您必须配置数据重新同步的时间和时长。这有助于防止影响您的正常复制操作。您需要指定:
-
采用 cron 格式的调度计划,用于定义重新同步操作可执行的时间。
-
最长持续时间,以确保重新同步操作不会延长至高峰使用时段。
建议将数据重新同步操作安排在非高峰时段,或者安排在源数据库变更极少或没有变更的时间段进行。
注意
计划时间包括等待目标应用流变为空,因为数据重新同步和正常复制无法同时运行。
使用案例
数据重新同步功能使用户能够调和源系统和目标系统之间的数据不一致问题。该功能会识别不匹配的记录并进行同步,以维持分布式环境中的数据一致性。以下使用案例演示了数据重新同步功能解决数据一致性难题的常见场景:
- 场景 1:完全加载任务 - 使用相同的 DMS 任务运行重新同步
-
在现有的 DMS 完全加载迁移任务中,可以执行以下操作:
-
启用验证:
Validation with data migration = true。 -
启用重新同步:
Data resync = true
-
- 场景 2:完全加载和 CDC、仅 CDC 任务 - 使用相同的 DMS 任务运行重新同步
-
在现有的 DMS CDC 迁移任务中,可以执行以下操作:
-
启用验证:
Validation with data migration = true。 -
启用重新同步:
Data resync = true -
指定重新同步时间表:
"ResyncSchedule": "0 0,2,4,6 * * *"。 -
指定重新同步时间:
MaxResyncTime": 60
-
- 场景 3:将完全加载和 CDC 任务,或仅 CDC 任务,用于数据复制和重新同步,并结合一个仅验证任务
-
要在使用重新同步时在另一个 DMS 任务中执行仅验证操作,可以执行以下操作:
-
创建仅验证 DMS CDC 任务。
注意
在数据重新同步期间,您必须记下并指定此任务的 ID。
-
在您的主要 CDC 任务中,禁用验证:
Data validation = false。 -
启用重新同步:
Data resync = true -
指定重新同步时间表:
"ResyncSchedule": "0 0,2,4,6 * * *"。 -
指定重新同步时间:
MaxResyncTime": 60。 -
指定仅验证 DMS CDC 任务的 ID。仅验证任务 ID 会附加在 ARN 的末尾。示例 ARN:
arn:aws:dms:us-west-2:123456789012:task:6DG4CLGJ5JSJR67CFD7UDXFY7KV6CYGRICL6KWI和仅示例验证任务 ID:6DG4CLGJ5JSJR67CFD7UDXFY7KV6CYGRICL6KWI。
-
最佳实践
您可以利用 Amazon Database Migration Service 中的数据重新同步功能来提高复制任务的持久性并实现一致性。使用数据重新同步功能的一些最佳做法是:
-
作为数据重新同步过程的一部分,存在不匹配的记录通过从源数据库获取并应用到目标数据库来进行修复。如果在重新同步时段更新了源数据库,则重新同步会读取最新的记录值并将其应用于目标数据库。这可能会导致 CDC 应用事件失败,并在目标数据库上引入暂时的不一致问题。为避免这种情况,您必须将重新同步时段安排在非工作时间或源数据库更改为零或最小的时段。
-
在源数据库活动最少的时段和可接受的目标延迟阈值内设置重新同步时段。较小的重新同步间隔可能会导致未处理的验证不匹配项累积,而当出现许多验证失败时,较大的时段可能会增加复制延迟。监控验证失败率和重新同步率,以确定源处于非活动状态期间的最佳重新同步时段。设置重新同步时段的一些示例是:
-
多个短窗口配置:
"ResyncSchedule": "0 0,2,4,6 * * *", "MaxResyncTime": 60 -
每日单窗口配置:
"ResyncSchedule": "0 0 * * *", "MaxResyncTime": 360
-
-
在重新同步窗口期间监控 DMS 中的复制延迟,并根据情况调整计划,以缓解大的延迟峰值。
-
您可以通过表统计信息或在目标数据库上查询
awsdms_validation_failures_v2表来查看重新同步结果。有关更多信息,请参阅使用 Amazon CloudWatch 监控复制任务。 -
当任务处于持续复制阶段时,请避免在重新同步窗口期间启动对个别表的重新加载。
-
CDC 复制任务的最佳实践:
-
数据库中的所有表都已完成加载过程。
-
在正在进行的验证过程中发现不匹配项。
-
根据重新同步计划窗口,复制任务会暂停片刻。
-
数据重新同步修复验证过程发现的问题。
-
复制过程将按计划恢复和重复。
-
数据重新同步配置和示例
- 数据重新同步设置配置:
-
您可以在 DMS 中为复制任务配置重新同步。以下是任务中数据重新同步设置配置的示例:
"ResyncSettings": { "EnableResync": true, "ResyncSchedule": "0 0,2,4,6 * * *", // Run at 12AM, 2AM, 4AM, and 6AM daily "MaxResyncTime": 60, // Run for maximum of 60 minutes, or 1 hour "ValidationTaskId": "TASK-ID-IF-NEEDED" //Optional, used only if validation is performed as a separate Validation only task }
常见的重新同步计划模式示例:
-
0 0 * * *:每天午夜运行一次。 -
0 0,12 * * *:每天午夜和中午各运行一次。 -
0 0,2,4,6, * * *:午夜至早上 6 点之间,每两小时运行一次。 -
0 1 * * 1:每周一凌晨 1 点运行。
注意
您必须为每天指定一个从 0 到 6 的数字。有关更多信息,请参阅 Cron 表达式规则。
- 监视重新同步操作:
-
您可以通过表统计信息监控重新同步操作。下面是一个输出示例:
{ "TableStatistics": { ... "ValidationFailedRecords": 1000, ... "ResyncRowsAttempted": 1000, "ResyncRowsSucceeded": 995, "ResyncRowsFailed": 5, "ResyncProgress": 99.5, // ratio of ResyncRowsSucceeded/ValidationFailedRecords "ResyncState": "Last resync at: 2024-03-14T06:00:00Z" } }
要在 Amazon DMS 中配置数据重新同步功能,您可以查看各种重新同步参数及其各自的配置设置。有关更多信息,请参阅 数据重新同步设置。有关数据重新同步日志设置的更多信息,请参阅日志记录任务设置。
验证和故障排除
- 验证:
-
启用数据验证后,Amazon DMS 将在目标数据库中创建一个结构如下所示的验证失败表:
CREATE TABLE awsdms_validation_failures_v2 ( "RESYNC_ID" bigint NOT NULL, "TASK_NAME" varchar(128) NOT NULL, "TABLE_OWNER" varchar(128) NOT NULL, "TABLE_NAME" varchar(128) NOT NULL, "FAILURE_TIME" timestamp NOT NULL, "KEY_TYPE" varchar(128) NOT NULL, "KEY" varchar(7800) NOT NULL, "FAILURE_TYPE" varchar(128) NOT NULL, "DETAILS" varchar(7000) NOT NULL, "RESYNC_RESULT" varchar(128) NULL, "RESYNC_TIME" timestamp NULL, "RESYNC_ACTION" varchar(128) NULL );您可以向此表写入一个查询,以了解发现的数据不匹配项以及如何解决它们。
启用验证后,Amazon DMS 将在目标数据库中创建验证失败表。如果您有任何问题,可以查询 awsdms_control.awsdms_validation_failures_v2 表以了解发现的数据不匹配项以及如何解决它们。有关更多信息,请参阅 Amazon DMS 数据验证中的故障排除部分。
- 常见工作流程:
-
在数据重新同步中进行验证期间,标准工作流程如下:
仅完全加载任务:
-
数据库中的所有表都已完成加载过程。
-
在正在进行的验证过程中发现不匹配项。
-
数据重新同步修复验证过程发现的问题。
-
验证过程对更正进行验证。
-
迁移任务已成功完成。
CDC 任务:
-
数据库中的所有表都已完成加载过程。
-
在正在进行的验证过程中发现不匹配项。
-
根据重新同步计划窗口,复制任务会暂停片刻。
-
数据重新同步修复验证过程发现的问题。
-
复制过程将按计划恢复和重复。
-
对任务所做的任何修改(例如在重新同步操作期间停止复制任务,或重新加载和重新验证表)都可能影响任务的行为和结果。一些已知的行为变化如下:
当您在重新同步操作进行期间停止复制任务时:
-
重新同步操作不会自动恢复。必须重新启动它。
-
将来的重新同步操作将按照配置的时间表进行。
-
所有未完成的修复都将在下一个重新同步计划窗口中尝试。
当您在数据库中重新加载表时:
-
重新同步操作会跳过任何正在重新加载的表。
-
对于已重新加载的表,之前的验证失败将被忽略。
-
新的验证将在重新加载操作完成后开始。
当您重新验证数据库中的表时:
-
重新同步操作的所有统计数据都将被重置。
-
对于已重新验证的表,之前的验证失败将被忽略。
注意
将任务升级或移动到 DMS 版本 3.6.1 及更高版本时,awsdms_control.awsdms_validation_failures_v1 表中的任何失败都不会重新同步。只有 awsdms_validation_failures_v2 表中的故障才会被重新同步。要在 awsdms_control.awsdms_validation_failures_v2 表中重新同步失败,必须重新加载任务、重新加载任务中的一个或多个表,或者重新验证一个或多个表。有关更多信息,请参阅以下链接:
-
要重新加载任务,请参阅
StartReplicationTaskAPI 参考。 -
要在任务中重新加载一个或多个表,请参阅 AmazonCLI 命令参考文档中的
reload-tables。 -
要重新验证一个或多个表,请参阅 Amazon CLI 命令参考文档
reload-tables一节中的validate-only选项。
.
Cron 表达式规则
要在复制任务期间在 Amazon DMS 中配置数据重新同步操作,可以使用 cron 表达式规则。这些规则允许您自定义重新同步的时间窗口,并根据业务需求进行安排。您可以使用各种参数,例如分钟、小时、天、月和星期几。每个参数的 cron 表达式规则为:
- 分钟:
-
-
分钟范围为 0 到 59。
-
可以使用(
-)、or/and来指定范围。最多 10 个项目,用逗号(,)分隔。 -
示例
-
2-5等于2,3,5,5。 -
1-2,3-4,5,7-10是有效范围。 -
1,2,3,4,5,6,7,8,9,10是有效范围。 -
1,2,3,4,5,6,7,8,9,10,11不是有效范围。在第 10 个范围项之后会跳过重新同步操作。
-
-
您可以使用(
*)。示例:*等于0-59。 -
只能将(
/)与(-)或(*)结合使用。示例
-
2-7/2等于2,4,6。 -
*/15等于0,15,30,45。
-
-
- 小时:
-
与“分钟”相同,但有效范围是从
0到23。
- 天:
-
-
与“分钟”相同,但有效范围是从
1到31。 -
在重新同步配置中支持使用
L。它被解释为当月的最后一天。不得将其与其他语法结合使用。
-
- 月份:
-
与“分钟”相同,但有效范围是从
1到12。
- 星期几:
-
-
与“分钟”相同,但有效范围是从
0到6。 -
您不能为周名添加字符串值。
-