AmazonDMS 数据验证 - Amazon Database Migration Service
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

AmazonDMS 数据验证

Amazon DMS提供数据验证支持,以确保准确地将数据从源迁移到目标。如果启用该功能,在为表执行完全加载后,立即开始验证。在发生时,验证会比较支持 CDC 的任务的增量更改。

在数据验证期间,Amazon DMS将源中的每一行与目标中的相应行进行比较,验证这些行包含相同的数据并报告任何不匹配。为了完成这一点Amazon DMS发出相应的查询以检索数据。请注意,这些查询将占用源和目标中的额外资源以及额外的网络资源。

对于启用验证的 CDC 任务,在开始验证新数据之前,将验证表中的所有预先存在的数据。

数据验证使用以下数据库,而 Amazon DMS 支持它们作为源终端节点和目标终端节点:

  • Oracle

  • PostgreSQL 兼容的数据库(PostgreSQL、Aurora PostgreSQL 或适用于 PostgreSQL 的 Aurora 无服务器)

  • MySQL 兼容的数据库(MySQL、MariaDB、Aurora MySQL 或适用于 MySQL 的 Aurora 无服务器)

  • Microsoft SQL Server

  • IBM Db2 LUW

有关支持的终端节点的更多信息,请参阅使用AmazonDMS 终端节点

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

有关这些设置的更多信息,请参阅 数据验证任务设置

对于一个例子ValidationSettingsJSON 文件中的任务设置,请参阅任务设置示例.

复制任务统计数据

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

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

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

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

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

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

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

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

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

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

    • 等待验证— 表正在等待验证。

    • 正在准备表— 准备迁移任务中启用的表以进行验证。

    • 待重新验证更新表后,表中的所有行都在等待验证。

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

  • ValidationSuspended – Amazon DMS 无法比较的记录数。例如,如果持续更新源中的记录,Amazon DMS 将无法比较源和目标。

  • ValidationFailed— 未通过数据验证阶段的记录数。

对于一个例子ValidationSettingsJSON 文件中的任务设置,请参阅任务设置示例.

您可以使用控制台查看数据验证信息,Amazon CLI,或者Amazon DMSAPI。

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

  • 使用 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 } }
  • 使用Amazon DMSAPI,使用CreateReplicationTask操作然后设置EnableValidation以参数为真的以验证任务迁移的数据。可以使用 DescribeTableStatistics 操作接收 JSON 格式的数据验证报告。

使用 Amazon CloudWatch 的复制任务统计

当亚马逊 CloudWatch 已启用,Amazon DMS提供以下复制任务统计信息:

  • ValidationSucceededRecordCount— 哪些行数Amazon DMS已验证,每分钟。

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

  • ValidationFailedOverallCount – 验证失败的行数。

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

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

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

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

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

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

从中收集数据验证信息 CloudWatch 启用统计信息,选择启用 CloudWatch 圆木使用控制台创建或修改任务时。然后,要查看数据验证信息并确保准确地将数据从源迁移到目标,请执行以下操作。

  1. 选择任务数据库迁移任务页.

  2. 选择CloudWatch 指标选项卡。

  3. Select验证从下拉菜单中。

在任务期间重新验证表

在任务运行时,您可以请求 Amazon DMS 执行数据验证。

Amazon Web Services Management Console

  1. 登录到Amazon Web Services Management Console然后打开Amazon DMS控制台https://console.aws.amazon.com/dms/v2/.

    如果您以Amazon Identity and Access Management(IAM) 用户,请确保您拥有相应的访问权限Amazon DMS。所需的权限,请参阅使用 Amazon DMS 所需的 IAM 权限.

  2. 从导航窗格中选择任务

  3. 选择具有要重新验证的表的正在运行的任务。

  4. 选择表统计数据选项卡。

  5. 选择您要重新验证的表(一次最多可选择 10 个表)。如果任务不再运行,则您无法重新验证该表。

  6. 选择 Revalidate (重新验证)

使用 JSON 编辑器修改验证规则

使用 JSON 编辑器向任务添加验证规则Amazon DMS控制台,请执行以下操作:

  1. Select数据库迁移任务.

  2. 从迁移任务列表中选择任务。

  3. 如果您的任务正在运行,请选择停止来自 的操作下拉菜单。

  4. 任务停止后,要修改任务,请选择修改来自 的操作下拉菜单。

  5. 表映射部分,选择JSON 编辑器然后将验证规则添加到表映射中。

例如,您可以添加以下验证规则以在源代码上运行替换函数。在这种情况下,如果验证规则遇到空字节,它会将其作为空格进行验证。

{ "rule-type": "validation", "rule-id": "1", "rule-name": "1", "rule-target": "column", "object-locator": { "schema-name": "Test-Schema", "table-name": "Test-Table", "column-name": "Test-Column" }, "rule-action": "override-validation-function", "source-function": "REPLACE(${column-name}, chr(0), chr(32))", "target-function": "${column-name}" }

仅验证任务

您可以创建仅验证任务来预览和验证数据,而无需执行任何迁移或数据复制。要创建仅验证任务,请将EnableValidationValidationOnly设置为true. 启用时ValidationOnly,则需要额外的要求。有关更多信息,请参阅 数据验证任务设置

对于仅完全负载的迁移类型,在报告许多故障时,仅验证任务的完成速度比 CDC 等效任务快得多。但是,对源端点或目标终端节点的更改被报告为满负载模式的故障,这可能是一个缺点。

CDC 验证只会根据平均延迟延迟延迟验证,并在报告失败之前多次重试失败。如果大多数数据比较导致失败,CDC 模式的唯一验证任务非常缓慢,这是潜在的缺点。

仅限完全加载验证

始于Amazon DMS版本 3.4.6 及更高版本,仅完全负载验证任务可以一次性快速比较源表和目标表中的所有行,立即报告任何故障,然后关闭。验证永远不会因此模式中的失败而暂停,它针对速度进行了优化。但是,对源或目标终端节点的更改被报告为失败。

注意

始于Amazon DMS3.4.6 及更高版本,此验证行为也适用于启用验证的完全负载迁移任务。

仅限 CDC 验证

CDC 仅验证任务会在重新开始验证源表和目标表之间的所有现有行。此外,仅 CDC 验证任务会持续运行,重新验证正在进行的复制更改,限制每次报告的失败次数,并在失败之前重试不匹配的行。它经过优化以防止误报。

如果 FailureMaxCount要么TableFailureMaxCount阈值被突破。这也适用于启用验证的 CDC 或满载 +CDC 迁移任务。而且,启用了验证的 CDC 任务会根据平均源和目标延迟延迟,延迟对每个更改行的重新验证。

但 CDC仅限验证任务不迁移数据且没有延迟。它设置ValidationQueryCdcDelaySeconds默认情况下为 180。而且,您可以增加金额以考虑高延迟环境,并有助于防止误报。

仅限验证使用案例

将迁移或复制任务的数据验证部分拆分为单独的使用案例仅限验证任务包括但不限于以下内容:

  • 准确控制验证的发生时间— 验证查询为源端点和目标终端节点增加了额外的负载。因此,首先迁移或复制一个任务中的数据,然后验证另一个任务的结果可能会有所帮助。

  • 减少复制实例的负载— 拆分数据验证以在自己的实例上运行可能是有利的。

  • 快速获取在给定时刻有多少行不匹配— 例如,就在维护窗口生产切换之前或期间 — 切换到目标终端节点,您可以创建一个仅限满载验证任务来获得问题的答案。

  • 使用 CDC 组件的迁移任务预计会出现验证失败时— 例如,如果迁移 Oraclevarchar2到 PostgreSQLjsonb,CDC 验证会继续重试这些失败的行,并限制每次报告的故障次数。但是,您可以创建一个仅限满载验证任务并获得更快的答案。

  • 您已开发了读取验证失败表的数据修复脚本/实用程序—(另请参阅,问题排查)。仅限满载验证的任务可快速报告失败,以便数据修复脚本采取行动。

对于一个例子ValidationSettingsJSON 文件中的任务设置,请参阅任务设置示例)。

问题排查

在验证期间,Amazon DMS在目标终端节点中创建一个新表:awsdms_validation_failures_v1. 如果有记录输入ValidationSuspended或者ValidationFailedState,Amazon DMS将诊断信息写入awsdms_validation_failures_v1. 您可以查询该表以帮助纠正验证错误。

有关更改在目标上创建表的默认模式的信息,请参阅控制表任务设置.

以下是 awsdms_validation_failures_v1 表描述:

列名称 数据类型 说明

TASK_NAME

VARCHAR(128) NOT NULL

Amazon DMS 任务标识符。

TABLE_OWNER VARCHAR(128) NOT NULL

表的架构 (所有者)。

TABLE_NAME

VARCHAR(128) NOT NULL

表名称。

FAILURE_TIME DATETIME(3) NOT NULL

发生失败的时间。

KEY_TYPE VARCHAR(128) NOT NULL

预留供 future 使用(值始终为 'Row')

KEY TEXT NOT NULL

这是行记录类型的主键。

FAILURE_TYPE VARCHAR(128) NOT NULL

验证错误的严重性。可以是RECORD_DIFFMISSING_SOURCE要么MISSING_TARGET.

DETAILS VARCHAR(8000) NOT NULL

JSON 格式的字符串,其中包含与给定密钥不匹配的所有源/目标列值。

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

select * from awsdms_validation_failures_v1 where TASK_NAME = 'VFPFKH4FJR3FTYKK2RYSI' TASK_NAME VFPFKH4FJR3FTYKK2RYSI TABLE_OWNER DB2PERF TABLE_NAME PERFTEST FAILURE_TIME 2020-06-11 21:58:44 KEY_TYPE Row KEY {"key": ["3451491"]} FAILURE_TYPE RECORD_DIFF DETAILS [[{'MYREAL': '+1.10106036e-01'}, {'MYREAL': '+1.10106044e-01'}],]

你可以看看DETAILS字段以确定哪些列不匹配。由于您拥有失败记录的主键,您可以查询源和目标终端节点以查看记录的哪个部分不匹配。

限制

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

    • 主键列不能是 CLOBBLOBBYTE 类型。

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

    • 使用NOVALIDATE子句是被视为主键或唯一索引。

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

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

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

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

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

  • 如果在验证期间持续修改一个或多个行,Amazon DMS无法验证那些行。

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

  • Amazon DMS不支持对视图进行数据验证。