AWS Database Migration Service
用户指南 (版本 API Version 2016-01-01)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

验证 AWS DMS 任务

AWS DMS 提供数据验证支持,以确保准确地将数据从源迁移到目标。如果为任务启用该功能,在为表执行完全加载后,AWS DMS 立即开始比较源和目标数据。

数据验证是可选的。AWS DMS 比较源和目标记录并报告所有不匹配项。此外,对于支持 CDC 的任务,AWS DMS 还比较增量更改并报告所有不匹配项。

在数据验证期间,AWS DMS 将源中的每一行与目标中的相应行进行比较,并确认这些行包含相同的数据。要完成该操作,AWS DMS 发出相应的查询以检索数据。请注意,这些查询将占用源和目标中的额外资源以及额外的网络资源。

数据验证适用于以下数据库:

  • Oracle

  • PostgreSQL

  • MySQL

  • MariaDB

  • Microsoft SQL Server

  • Amazon Aurora (MySQL)

  • Amazon Aurora (PostgreSQL)

除了迁移本身所需的时间以外,数据验证还需要占用额外的时间。所需的额外时间取决于迁移的数据量。

数据验证设置包括以下内容:

  • 要启用数据验证,请将 EnableValidation 设置设为 true

  • 要调整 AWS DMS 在验证期间使用的执行线程数,请设置 ThreadCount 值。ThreadCount 的默认值为 5。如果将 ThreadCount 设置为较大的数字,AWS DMS 可以更快地完成验证;不过,它还会执行更多同时查询,从而在源和目标上占用更多资源。

例如,以下 JSON 启用验证并将线程数从 5 个 (默认设置) 增加到 8 个。

ValidationSettings": { "EnableValidation":true, "ThreadCount":8 }

复制任务统计数据

如果启用了数据验证,AWS DMS 将在表级别提供以下统计数据:

  • ValidationState — 表的验证状态。该参数可能具有以下值:

    • Not enabled — 没有在迁移任务中为表启用验证。

    • Pending records — 表中的某些记录正在等待验证。

    • Mismatched records — 表中的某些记录在源和目标之间不匹配。可能会因多种原因而发生不匹配;有关更多信息,请参阅目标终端节点上的 awsdms_validation_failures 表。

    • Suspended records — 无法验证表中的某些记录。

    • No primary key — 无法验证表,因为该表没有主键。

    • Table error — 未验证表,因为该表处于错误状态并且未迁移某些数据。

    • Validated — 已验证表中的所有行。如果更新表,则可能会变为非 Validated 状态。

    • Error — 无法验证表,因为出现意外错误。

  • ValidationPending — 已迁移到目标但尚未验证的记录数。

    ValidationSuspended — AWS DMS 无法比较的记录数。例如,如果持续更新源中的记录,AWS DMS 将无法比较源和目标。有关更多信息,请参阅 错误处理任务设置

  • ValidationFailed — 未通过数据验证阶段的记录数。有关更多信息,请参阅错误处理任务设置

  • ValidationSucceededRecordCount — AWS DMS 每分钟验证的行数。

  • ValidationAttemptedRecordCount — 每分钟尝试验证的行数。

  • ValidationFailedOverallCount — 验证失败的行数。

  • ValidationSuspendedOverallCount — 验证已暂停的行数。

  • ValidationPendingOverallCount — 验证待处理的行数。

  • ValidationBulkQuerySourceLatency — AWS DMS 可以批量验证数据,特别是在有许多更改时进行完全加载和持续复制期间的特定场景中。此指标指示从源终端节点读取批量数据所需的延迟。

  • ValidationBulkQueryTargetLatency — AWS DMS 可以批量验证数据,特别是在有许多更改时进行完全加载和持续复制期间的特定场景中。此指标指示从目标终端节点读取批量数据所需的延迟。

  • ValidationItemQuerySourceLatency — 在持续复制期间,数据验证可以标识持续更改并验证这些更改。此指标指示从源中读取这些更改时的延迟。验证可根据更改数运行比所需数量更多的查询,前提是验证期间出错。

  • ValidationItemQueryTargetLatency — 在持续复制期间,数据验证可以标识持续更改并逐行验证这些更改。此指标向我们提供从目标读取这些更改时的延迟。验证可根据更改数运行比所需数量更多的查询,前提是验证期间出错。

您可以使用 控制台、AWS CLI 或 AWS DMS API 查看数据验证信息。

  • 在控制台中,您可以选择在创建或修改任务时验证该任务。要使用控制台查看数据验证报告,请在任务页中选择任务,然后在详细信息部分中选择表统计数据选项卡。

  • 在使用 CLI 时,请在创建或修改任务时将 EnableValidation 参数设置为 true 以开始数据验证。以下示例创建一个任务并启用数据验证。

    create-replication-task --replication-task-settings '{"ValidationSettings":{"EnableValidation":true}}' --replication-instance-arn arn:aws:dms:us-east-1:5731014: rep:36KWVMB7Q --source-endpoint-arn arn:aws:dms:us-east-1:5731014: endpoint:CSZAEFQURFYMM --target-endpoint-arn arn:aws:dms:us-east-1:5731014: endpoint:CGPP7MF6WT4JQ --migration-type full-load-and-cdc --table-mappings '{"rules": [{"rule-type": "selection", "rule-id": "1", "rule-name": "1", "object-locator": {"schema-name": "data_types", "table-name": "%"}, "rule-action": "include"}]}'

    可以使用 describe-table-statistics 命令接收 JSON 格式的数据验证报告。以下命令显示数据验证报告。

    aws dms describe-table-statistics --replication-task-arn arn:aws:dms:us-east-1:5731014: rep:36KWVMB7Q

    该报告类似于以下内容。

    { "ReplicationTaskArn": "arn:aws:dms:us-west-2:5731014:task:VFPFTYKK2RYSI", "TableStatistics": [ { "ValidationPendingRecords": 2, "Inserts": 25, "ValidationState": "Pending records", "ValidationSuspendedRecords": 0, "LastUpdateTime": 1510181065.349, "FullLoadErrorRows": 0, "FullLoadCondtnlChkFailedRows": 0, "Ddls": 0, "TableName": "t_binary", "ValidationFailedRecords": 0, "Updates": 0, "FullLoadRows": 10, "TableState": "Table completed", "SchemaName": "d_types_s_sqlserver", "Deletes": 0 } }
  • 在使用 AWS DMS API 时,请使用 CreateReplicationTask 操作创建一个任务,并将 EnableValidation 参数设置为 true 以验证该任务迁移的数据。可以使用 DescribeTableStatistics 操作接收 JSON 格式的数据验证报告。

故障排除

在验证期间,AWS DMS 在目标终端节点中创建一个新表:awsdms_validation_failures_v1。如果任何记录进入 ValidationSuspendedValidationFailed 状态,则 AWS DMS 将诊断信息写入到 awsdms_validation_failures_v1 中。您可以查询该表以帮助纠正验证错误。

以下是 awsdms_validation_failures_v1 表描述:

列名称 数据类型 说明

TASK_NAME

VARCHAR(128) NOT NULL

AWS DMS 任务标识符。

TABLE_OWNER VARCHAR(128) NOT NULL

表的架构 (所有者)。

TABLE_NAME

VARCHAR(128) NOT NULL

表名称。

FAILURE_TIME DATETIME(3) NOT NULL

发生失败的时间。

KEY TEXT NOT NULL

这是行记录类型的主键。

FAILURE_TYPE VARCHAR(128) NOT NULL

验证错误的严重性。可以是 FailedSuspended

通过查询 awsdms_validation_failures_v1 表,以下查询显示任务的所有失败。任务名称应该是任务的外部资源 ID。任务的外部资源 ID 是任务 ARN 中的最后一个值。例如,对于 ARN 值为 arn:aws:dms:us-west-2:5599:task: VFPFKH4FJR3FTYKK2RYSI 的任务,任务的外部资源 ID 为 VFPFKH4FJR3FTYKK2RYSI。

select * from awsdms_validation_failures_v1 where TASK_NAME = ‘VFPFKH4FJR3FTYKK2RYSI’

在知道了失败记录的主键后,您可以查询源和目标终端节点以查看记录的哪个部分不匹配。

限制

  • 数据验证要求表具有主键或唯一索引。

    • 主键列不能是 CLOBBLOBBYTE 类型。

    • 对于 VARCHARCHAR 类型的主键列,长度必须小于 1024。

  • 如果目标 PostgreSQL 实例中的主键列的排序规则未设置为“C”,则与 Oracle 中的排序顺序相比,PostgreSQL 的主键的排序顺序将不同。如果 PostgreSQL 和 Oracle 的排序顺序不同,数据验证将无法验证记录。

  • 数据验证将针对源和目标数据库生成额外的查询。您必须确保两个数据库具有足够的资源以处理该额外负载。

  • 如果迁移使用自定义筛选或将几个数据库合并为一个数据库,则不支持数据验证。

  • 对于源或目标 Oracle 终端节点,AWS DMS 使用 DBMS_CRYPTO 验证 BLOB。如果 Oracle 终端节点使用 BLOB,则必须为用于访问 Oracle 终端节点的用户账户授予 dbms_crypto 执行权限。您可以运行以下语句以执行该操作:

    grant execute on sys.dbms_crypto to <dms_endpoint_user>;
  • 如果验证期间在 AWS DMS 外部修改了目标数据库,则可能不会准确报告差异。如果在 AWS DMS 对目标表执行验证期间,某个应用程序将数据写入到该表中,则可能会发生这种情况。

  • 如果在验证期间持续修改一个或多个行,则 AWS DMS 无法验证这些行。不过,您可以在任务完成后手动验证这些行。

  • 如果 AWS DMS 检测到超过 10000 个失败或无法验证的记录,则会停止验证。在继续之前,先解决数据的任何根本问题。