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

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

AmazonDMS 数据验证

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

在数据验证期间,Amazon DMS将源中的每一行与其在目标位置的相应行进行比较,验证这些行包含相同的数据,并报告任何不匹配的情况。为了Amazon DMS解决这个问题,需要进行适当的查询来检索数据。请注意,这些查询将在源和目标上消耗额外的资源以及额外的网络资源。

对于启用了验证的仅限 CDC 的任务,在开始验证新数据之前,表中所有先前存在的数据都要经过验证。

数据验证适用于Amazon DMS支持以下源数据库作为源端点的地方:

  • Oracle

  • 与 PostgreSQL 兼容的数据库(适用于 PostgreSQL、Aurora PostgreSQL 或 Aurora Serverless)

  • 与 mySQL 兼容的数据库(MySQL、MariaDB、Aurora MySQL 或 Aurora Serverles

  • Microsoft SQL Server

  • IBM Db2 LUW

数据验证适用于Amazon DMS支持以下目标数据库作为目标端点的地方:

  • Oracle

  • 与 PostgreSQL 兼容的数据库(适用于 PostgreSQL、Aurora PostgreSQL 或 Aurora Serverless)

  • 与 mySQL 兼容的数据库(MySQL、MariaDB、Aurora MySQL 或 Aurora Serverles

  • Microsoft SQL Server

  • IBM Db2 LUW

  • Amazon S3。有关验证 Amazon S3 目标数据的信息,请参阅亚马逊 S3 目标数据验证

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

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

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

有关 JSON 文件中ValidationSettings任务设置的示例,请参阅任务设置示例

复制任务统计数据

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

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

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

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

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

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

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

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

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

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

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

    • 准备表-准备迁移任务中启用的表格以供验证。

    • 等待重新验证-更新表后,表中的所有行都处于等待验证状态。

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

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

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

有关 JSON 文件中ValidationSettings任务设置的示例,请参阅任务设置示例

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

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

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

    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 DMS API 使用CreateReplicationTask操作创建任务,并将EnableValidation参数设置为 true 以验证任务迁移的数据。使用DescribeTableStatistics操作接收 JSON 格式的数据验证报告。

亚马逊的复制任务统计信息 CloudWatch

启用 A CloudWatch mazon 后,Amazon DMS提供以下复制任务统计信息:

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

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

  • ValidationFailedOverallCount— 验证失败的行数。

  • ValidationSuspendedOverallCount— 暂停验证的行数。

  • ValidationPendingOverallCount— 验证仍处于待处理状态的行数。

  • ValidationBulkQuerySourceLatency— Amazon DMS 可以批量进行数据验证,尤其是在某些情况下,在满载或持续复制期间有许多更改。此指标指示从源终端节点读取批量数据所需的延迟。

  • ValidationBulkQueryTargetLatency— Amazon DMS 可以批量进行数据验证,尤其是在某些情况下,在满载或持续复制期间有许多更改。此指标指示从目标终端节点读取批量数据所需的延迟。

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

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

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

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

  2. 选择CloudWatch指标选项卡。

  3. 从下拉菜单中选择验证

在任务期间重新验证表

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

Amazon Web Services Management Console

  1. 登录Amazon Web Services Management Console并通过 https://console.aws.amazon.com/dms/v2/ 打开Amazon DMS控制台。

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

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

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

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

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

  6. 选择 Revalidate (重新验证)

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

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

  1. 选择数据库迁移任务

  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 模式的仅限验证的任务会非常慢,这是一个潜在的缺点。

必须按照与复制任务相同的方向设置仅限验证的任务,尤其是对于 CDC 而言。这是因为 CDC Validation Only 任务会检测哪些行已更改,哪些行需要根据源上的更改日志进行重新验证。如果将目标指定为源,则它只知道 DMS 发送到目标的更改,不能保证发现复制错误。

仅限满载验证

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

注意

从Amazon DMS版本 3.4.6 及更高版本开始,此验证行为也适用于启用验证的满负载迁移任务。

仅限 CDC 验证

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

如果超过或TableFailureMaxCount阈值,则暂停对表( FailureMaxCount或整个任务)的验证。这也适用于启用验证的 CDC 或 Full Load+CDC 迁移任务。而且,启用了验证功能的 CDC 任务会根据平均源和目标延迟来延迟对每个更改的行进行重新验证。

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

仅限验证的用例

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

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

  • 减少复制实例的负载-将数据验证拆分到自己的实例上运行可能很有好处。

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

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

  • 你已经开发了一个读取验证失败表的数据修复脚本/实用程序 ——(另请参阅)。问题排查仅限满载验证的任务会快速报告故障,以供数据修复脚本处理。

有关 JSON 文件中ValidationSettings任务设置的示例,请参阅任务设置示例)。

问题排查

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

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

以下是 awsdms_control.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

保留以备将来使用(值始终为 “行”)

KEY TEXT NOT NULL

这是行记录类型的主键。

FAILURE_TYPE VARCHAR(128) NOT NULL

验证错误的严重性。可以是RECORD_DIFFMISSING_SOURCE也可以是MISSING_TARGET

DETAILS VARCHAR(8000) NOT NULL

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

通过查询 awsdms_control.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' 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子句创建的 Oracle 密钥被视为主键或唯一索引。

    • 对于没有主键且只有唯一键的 Oracle 表,具有唯一约束条件的列也必须有NOT NULL约束条件。

  • 不支持验证 NULL PK/UK 值。

  • 如果目标 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不支持视图的数据验证。

  • Amazon DMS使用字符替换任务设置时不支持数据验证。

  • Amazon DMS不支持验证 Oracle 长整型。

  • Amazon DMS不支持在异构迁移期间验证 Oracle Spatial 类型。

有关使用 S3 目标验证时的限制,请参阅使用 S3 目标验证的限制