本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
主题
AWS DMS 为数据验证提供支持,以确保您的数据从源准确迁移到目标。如果启用,则在对表执行完全加载后立即开始验证。验证功能会比较CDC已启用任务的增量更改。
在数据验证期间, AWS DMS 将源中的每行与目标位置的相应行进行比较,验证这些行是否包含相同的数据,并报告任何不匹配的情况。为此 AWS DMS ,需要通过适当的查询来检索数据。请注意,这些查询将占用源和目标中的额外资源以及额外的网络资源。
对于CDC仅启用了验证的任务,在开始验证新数据之前,将对表中所有先前存在的数据进行验证。
数据验证适用于以下源数据库,只要 AWS DMS 支持这些源数据库作为源端点:
-
Oracle
-
SQL兼容 Postgre 的数据库(Postgre、SQL Aurora Postgre SQL 或 Postgre 的 Aurora Serverless SQL
-
我的SQL兼容数据库(我的、MariaDB SQL、Aurora My 或 Aurora Serverless for M SQL y)SQL
-
微软SQL服务器
-
IBMDb2 LUW
数据验证适用于以下目标数据库,只要 AWS DMS 支持它们作为目标端点:
-
Oracle
-
SQL兼容 Postgre 的数据库(Postgre、SQL Aurora Postgre SQL 或 Postgre 的 Aurora Serverless SQL
-
我的SQL兼容数据库(我的、MariaDB SQL、Aurora My 或 Aurora Serverless for M SQL y)SQL
-
微软SQL服务器
-
IBMDb2 LUW
-
Amazon Redshift
-
Amazon S3。有关验证 Amazon S3 目标数据的信息,请参阅 Amazon S3 目标数据验证。
有关支持的终端节点的更多信息,请参阅使用 AWS DMS 端点。
除了迁移本身所需的时间以外,数据验证还需要占用额外的时间。所需的额外时间取决于迁移的数据量。
有关这些设置的更多信息,请参阅 数据验证任务设置。
有关JSON文件中ValidationSettings
任务设置的示例,请参阅任务设置示例。
复制任务统计数据
启用数据验证后,将在表级别 AWS DMS 提供以下统计信息:
-
ValidationState— 表的验证状态。参数可能具有以下值:
Not enabled – 没有在迁移任务中为表启用验证。
Pending records – 表中的某些记录正在等待验证。
不匹配的记录 – 表中的某些记录在源和目标之间不匹配。可能会因多种原因而发生不匹配;有关更多信息,请参阅目标终端节点上的
awsdms_control.awsdms_validation_failures_v1
表。Suspended records – 无法验证表中的某些记录。
No primary key – 无法验证表,因为该表没有主键。
Table error – 未验证表,因为该表处于错误状态并且未迁移某些数据。
已验证 – 表中的所有行已验证。如果更新表,则可能会变为非 Validated 状态。
Error – 无法验证表,因为出现意外错误。
等待验证 – 表正在等待验证。
准备表 – 准备迁移任务中启用的表以进行验证。
等待重新验证 – 表更新后,表中的所有行在等待验证。
-
ValidationPending— 已迁移到目标但尚未经过验证的记录数量。
-
ValidationSuspended— AWS DMS 无法比较的记录数。例如,如果源记录不断更新,则 AWS DMS 无法比较来源和目标。
-
ValidationFailed— 未通过数据验证阶段的记录数。
有关JSON文件中ValidationSettings
任务设置的示例,请参阅任务设置示例。
您可以使用控制台、或 AWS CLI,查看数据验证信息 AWS DMS API。
在控制台中,您可以选择在创建或修改任务时验证该任务。要使用控制台查看数据验证报告,请在任务页中选择任务,然后在详细信息部分中选择表统计数据选项卡。
在CLI创建或修改任务以开始数据验证
true
时,使用,将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 } }
使用 AWS DMS API,使用CreateReplicationTask操作创建任务并将
EnableValidation
参数设置为 true,以验证任务迁移的数据。使用DescribeTableStatistics操作接收JSON格式的数据验证报告。
使用 Amazon 进行复制任务的统计数据 CloudWatch
启 CloudWatch 用 Amazon 后,将 AWS DMS 提供以下复制任务统计信息:
ValidationSucceededRecordCount-每分钟 AWS DMS 验证的行数。
ValidationAttemptedRecordCount— 每分钟尝试验证的行数。
ValidationFailedOverallCount— 验证失败的行数。
ValidationSuspendedOverallCount-暂停验证的行数。
ValidationPendingOverallCount— 验证仍处于待处理状态的行数。
ValidationBulkQuerySourceLatency— AWS DMS 可以批量进行数据验证,尤其是在满载或持续复制期间存在许多更改的某些情况下。此指标指示从源终端节点读取批量数据所需的延迟。
ValidationBulkQueryTargetLatency— AWS DMS 可以批量进行数据验证,尤其是在满载或持续复制期间存在许多更改的某些情况下。此指标指示从目标终端节点读取批量数据所需的延迟。
ValidationItemQuerySourceLatency— 在持续的复制过程中,数据验证可以识别正在进行的更改并验证这些更改。此指标指示从源中读取这些更改时的延迟。验证可根据更改数运行比所需数量更多的查询,前提是验证期间出错。
ValidationItemQueryTargetLatency— 在持续复制期间,数据验证可以识别正在进行的更改并逐行验证更改。此指标向我们提供从目标读取这些更改时的延迟。验证可根据更改数运行比所需数量更多的查询,前提是验证期间出错。
要从 CloudWatch 启用的统计数据中收集数据验证信息,请在使用控制台创建或修改任务时选择启用 CloudWatch 日志。然后,要查看数据验证信息并确保您的数据已准确地从源迁移到目标,请执行以下操作。
从数据库迁移任务页面选择任务。
选择 “CloudWatch 指标” 选项卡。
从下拉菜单中选择验证。
在任务期间重新验证表
在任务运行时,您可以请求 AWS DMS 执行数据验证。
AWS Management Console
-
登录 AWS Management Console 并在 https://console.aws.amazon.com/dms/v2
/上打开 AWS DMS 控制台。 如果您以 AWS Identity and Access Management (IAM) 用户身份登录,请确保您拥有相应的访问权限 AWS DMS。所需权限,请参阅IAM使用所需的权限 AWS DMS。
-
从导航窗格中选择任务。
-
选择具有要重新验证的表的正在运行的任务。
选择表统计数据选项卡。
-
选择您要重新验证的表(一次最多可选择 10 个表)。如果任务不再运行,则您无法重新验证该表。
-
选择 Revalidate (重新验证)。
使用JSON编辑器修改验证规则
要使用 AWS DMS 控制台中的JSON编辑器向任务添加验证规则,请执行以下操作:
-
选择数据库迁移任务。
-
从迁移任务列表中选择您的任务。
-
如果您的任务正在运行,请从操作下拉菜单中选择停止。
-
任务停止后,要修改您的任务,请从操作下拉菜单中选择修改。
-
在表映射部分中,选择JSON编辑器并将您的验证规则添加到表映射中。
例如,您可以添加以下验证规则以在源上运行替换函数。在这种情况下,如果验证规则遇到 null 字节,则会将其验证为空格。
{
"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}"
}
仅验证任务
您可以创建仅验证的任务来预览和验证数据,而无需执行任何迁移或数据复制。要创建仅验证的任务,请将 EnableValidation
和 ValidationOnly
设置设为 true
。启用 ValidationOnly
后,还需要满足其他要求。有关更多信息,请参阅 数据验证任务设置。
对于仅限满载的迁移类型,当报告许多失败时,仅限验证的任务的完成速度要比CDC同类任务快得多。但是,对源端点或目标端点的更改会被报告为完全加载模式失败,这可能是一个缺点。
仅限CDC验证的任务会根据平均延迟来延迟验证,并且在报告失败之前会多次重试失败。如果大多数数据比较都导致失败,则仅对CDC模式进行验证的任务会非常缓慢,这是一个潜在的缺点。
仅限验证的任务必须与复制任务的设置方向相同,尤其是对于。CDC这是因为 “仅限CDC验证” 任务会根据源上的更改日志检测哪些行已更改并需要重新验证。如果目标被指定为源,则它只知道发送给目标的更改,DMS并且不能保证会捕获复制错误。
完全加载仅验证
从 3.4.6 及更高 AWS DMS 版本开始,仅限满载验证的任务一次性快速比较源表和目标表中的所有行,立即报告任何故障,然后关闭。在此模式下针对速度进行了优化,验证永远不会因为失败而暂停。但是,对源端点或目标端点的更改会被报告为失败。
注意
从 3.4.6 及更高 AWS DMS 版本开始,此验证行为也适用于启用验证的满载迁移任务。
CDC仅限验证
仅限CDC验证的任务会在重新开始时验证源表和目标表之间的所有现有行。此外,仅限CDC验证的任务会持续运行,重新验证正在进行的复制更改,限制每次传递报告的失败次数,并在失败之前重试不匹配的行。它经过优化,可以防止误报。
如果超过
FailureMaxCount
或 TableFailureMaxCount
的阈值,则会暂停对表(或整个任务)的验证。这也适用于启用了验证的CDC或 Full Load+ CDC 迁移任务。而且,启用了验证的CDC任务会根据平均源和目标延迟延迟来延迟对每个更改的行的重新验证。
但是,仅限CDC验证的任务不会迁移数据,也没有延迟。默认情况下,它将 ValidationQueryCdcDelaySeconds
设置为 180。而且,您可以增加容量以应对高延迟环境,并帮助防止误报。
仅验证的使用案例
在迁移或复制任务中,将数据验证部分拆分为单独的仅验证任务的使用案例包括但不限于以下内容:
-
精确控制何时进行验证 – 验证查询会给源端点和目标端点增加额外的负载。因此,先在一项任务中迁移或复制数据,然后在另一项任务中验证结果会有所帮助。
-
减少复制实例的负载 – 将数据验证拆分为在自己的实例上运行可能很有好处。
-
快速获取在给定时刻有多少行不匹配 – 例如在维护时段,进行生产切换到目标端点之前或期间,您可以创建一个完全加载仅验证任务来获取问题的答案。
-
当包含CDC组件的迁移任务预计会出现验证失败时,例如,如果将 Oracle 迁移
varchar2
到 Postgre SQLjsonb
,则CDC验证会不断重试这些失败的行,并限制每次报告的失败次数。但是,您可以创建完全加载仅验证任务,并更快地获得答案。 -
您已经开发了一个数据修复脚本/实用程序,可以读取验证失败表 –(另请参阅故障排除)。完全加载仅验证任务可以快速报告故障,以便数据修复脚本处理。
有关JSON文件中ValidationSettings
任务设置的示例,请参阅任务设置示例)。
故障排除
验证期间,在目标端点 AWS DMS 创建一个新表:awsdms_control.awsdms_validation_failures_v1
。如果有任何记录进入ValidationSuspended或ValidationFailed状态,则 AWS DMS 会将诊断信息写入awsdms_control.awsdms_validation_failures_v1
。您可以查询该表以帮助纠正验证错误。
有关在目标上更改所创建表的默认架构的信息,请参阅控制表任务设置。
以下是 awsdms_control.awsdms_validation_failures_v1
表描述:
列名称 | 数据类型 | 描述 |
---|---|---|
|
|
AWS DMS 任务标识符。 |
TABLE_OWNER |
VARCHAR(128) NOT NULL |
表的架构 (所有者)。 |
|
VARCHAR(128) NOT NULL |
表名称。 |
FAILURE_TIME |
DATETIME(3) NOT NULL |
发生失败的时间。 |
KEY_TYPE |
VARCHAR(128) NOT NULL |
保留供将来使用(值始终为“Row”) |
KEY |
TEXT NOT NULL |
这是行记录类型的主键。 |
FAILURE_TYPE |
VARCHAR(128) NOT NULL |
验证错误的严重性。可以是 |
DETAILS |
VARCHAR(8000) NOT NULL |
JSON与给定密钥不匹配的所有源/目标列值的格式化字符串。 |
以下是 “我的SQL目标” 的示例查询,它将通过查询awsdms_control.awsdms_validation_failures_v1
表向您显示任务的所有失败。请注意,架构名称和查询语法因目标引擎版本而异。任务名称应该是任务的外部资源 ID。任务的外部资源 ID 是任务中的最后一个值ARN。例如,对于ARN值为 arn: aws: dms: us-west-2:5599: task: 的任务,该任务的外部资源 ID 将是。VFPFKH4FJR3FTYKK2RYSI 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
字段以确定哪些列不匹配。由于您已知失败记录的主键,您可以查询源和目标终端节点以查看记录的哪个部分不匹配。
Redshift 验证性能
Amazon Redshift 在多个方面与关系数据库不同,包括列式存储MPP、数据压缩和其他因素。这些差异使 Redshift 具有与关系数据库不同的性能特征。
在完全加载复制阶段,验证使用范围查询,数据大小由 PartitionSize
设置控制。这些基于范围的查询会选择源表中的所有记录。
对于正在进行的复制,查询会在基于范围的提取和单个记录提取之间切换。查询类型是根据多个因素动态确定的,例如:
查询量
源表上的DML查询类型
任务延迟
记录总数
验证设置,例如
PartitionSize
由于验证查询,您可能会在 Amazon Redshift 集群上看到额外的负载。由于上述因素因用例而异,因此您必须检查验证查询性能,并相应地调整集群和表。一些缓解性能问题的方案包括:
减小
PartitionSize
和ThreadCount
设置以帮助减少完全加载验证期间的工作量。请注意,这将减慢数据验证的速度。虽然 Redshift 不强制使用主键,但 AWS DMS 它依靠主键来唯一标识目标上的记录以进行数据验证。如果可能,请将主键设置为镜像排序键,以便更快地执行完全加载验证查询。
增强的数据验证 AWS Database Migration Service
现在,复制引擎版本 3.5.4 中提供了增强的数据验证功能,适用于CDC迁移任务的满负荷和满载。目前,此增强功能支持从 Oracle 到 Postgre SQL、SQL服务器到 Postgre SQL、Oracle 到 Oracle 以及SQL服务器到SQL服务器的迁移路径。
先决条件
-
Oracle:
SYS.DBMS_CRYPTO
向访问 Oracle 终端节点的用户帐户授予EXECUTE
权限:GRANT EXECUTE ON SYS.DBMS_CRYPTO TO dms_endpoint_user;
-
在 Postgre SQL 数据库上安装
pgcrypto
扩展程序:注意
对于 Amazon for P RDS 来说ostgreSQLinstances,
pgcrypto
扩展程序已经启用。对于自行管理的 Postgre SQL 实例,您需要安装
contrib
模块库并创建扩展:-
安装
contrib
模块库。例如,在装有亚马逊 Linux 和 Postgre SQL 15 的亚马逊EC2实例上:sudo dnf install postgresql15-contrib
-
创建扩
pgcrypto
展:CREATE EXTENSION IF NOT EXISTS pgcrypto;
-
-
对RDS于 Amazon for Postgre SQL 实例,请为 AWS DMS 终端节点配置SSL模式:
-
默认情况下,Amazon 会RDS强制建立SSL连接。在RDS为亚马逊 Postgre SQL 实例创建 AWS DMS 终端节点时,使用 “SSL模式” 选项 = “必需”。
-
如果要使用 “SSL模式” 选项 = “无”,请在
rds.force_ssl
参数组中将参数设置为 0。RDS
-
-
对于 Postgre SQL 12 和 13,创建
BIT_XOR
聚合:CREATE OR REPLACE AGGREGATE BIT_XOR(IN v bit) (SFUNC = bitxor, STYPE = bit);
限制
此增强的数据验证功能具有以下限制:
-
数据库端点要求:此改进仅适用于满足以下条件的数据库端点:
AWS Secrets Manager 用于存储凭据。
对于 Microsoft SQL 服务器,还支持 Kerberos 身份验证。
-
数据库版本支持:
Postgre SQL 12 及更高版本
甲骨文 12.1 及更高版本
对于 2019 年以下的 Microsoft SQL 服务器版本,不支持验证NCHAR和NVARCHAR数据类型。
限制
-
数据验证要求表具有主键或唯一索引。
主键列不能是
CLOB
、BLOB
或BYTE
类型。-
对于
VARCHAR
或CHAR
类型的主键列,长度必须小于 1024。您必须在数据类型中指定长度。您不能使用无界数据类型作为数据验证的主键。 -
使用
NOVALIDATE
子句创建的 Oracle 键不被视为主键或唯一索引。 -
对于没有主键且只有唯一键的 Oracle 表,具有唯一约束条件的列也必须具有
NOT NULL
约束条件。
-
不支持验证 NULL PK/UK 值。
-
如果目标 Postgre SQL 实例中主键列的排序规则未设置为 “C”,则主键的排序顺序与 Oracle 中的排序顺序不同。如果 Postgre SQL 和 Oracle 之间的排序顺序不同,则数据验证将无法验证记录。
-
数据验证将针对源和目标数据库生成额外的查询。您必须确保两个数据库具有足够的资源以处理该额外负载。对于 Redshift 目标而言尤其如此。有关更多信息,请参阅下面的Redshift 验证性能。
-
将几个数据库合并为一个数据库时,不支持数据验证。
-
对于源或目标 Oracle 端点, AWS DMS 使用 DBMS _ CRYPTO 进行验证LOBs。如果您的 Oracle 终端节点使用LOBs,则必须向用于访问 Oracle 终端节点的用户帐户授予对 dbms_crypto 的执行权限。您可以运行以下语句以执行该操作:
grant execute on sys.dbms_crypto to
dms_endpoint_user
; -
如果在校验 AWS DMS 期间之外修改了目标数据库,则可能无法准确报告差异。如果您的一个应用程序向目标表写入数据,同时对同一个表执行验证, AWS DMS 则会出现此结果。
-
如果在验证期间不断修改一行或多行,则 AWS DMS 无法验证这些行。
-
如果 AWS DMS 检测到超过 10,000 条失败或暂停的记录,则会停止验证。在继续之前,先解决数据的任何根本问题。
-
AWS DMS 不支持视图的数据验证。
-
AWS DMS 使用字符替换任务设置时不支持数据验证。
AWS DMS 不支持验证 Oracle LONG 类型。
AWS DMS 不支持在异构迁移期间验证 Oracle Spatial 类型。
数据验证会忽略表中那些在表映射中存在数据掩码转换的列。
如果表的 PK/UK 列有数据屏蔽转换规则,则数据验证会跳过整个表。此类表的验证状态将显示为无主键。
有关使用 S3 目标验证的限制,请参阅使用 S3 目标验证的限制。