数据验证检查迁移作业是否准确迁移了您的数据。验证引擎连接到源数据库和目标数据库,并将迁移的文档与源数据进行比较。验证引擎验证以下内容:
字段名称
数据类型
字段路径
Values
一次性迁移作业默认运行数据验证。要了解如何为作业启用或禁用验证,请参阅 使用数据验证。
注意
本页介绍 Relational Migrator 1.18 或更高版本中的验证引擎。早期版本仅检查主键值、验证较窄的模式范围并运行较慢。要使用这些验证功能,请升级到 1.18 或更高版本。
数据验证工作原理
对于迁移作业中的每个集合,验证引擎完成以下步骤:
Compares the number of documents in the destination collection to the number of rows in the source table. To learn more, see Document Count Comparison.
使用源表的主键以批处理方式从源数据库中检索行,并将每个源列映射到集合中对应的字段路径(Field Path)。
从目标集合中检索具有相同主键的文档。验证引擎会展开并平展这些文档,以便将每个字段值与对应的源列值进行比较。
Compares the source rows to the destination documents. To learn more, see Field-Level Comparison.
如果验证引擎为每个集合完成这些步骤而未发现任何不匹配,则数据验证过程会报告 VERIFIED 状态。要了解有关验证状态的更多信息,请参阅 数据验证状态。
文档计数比较
如果目标集合中的文档数与新文档映射的源表中的行数不匹配,验证引擎将报告不匹配。计数不匹配不会阻止集合的验证。
字段级比较
验证引擎通过主键值将源行与目标文档进行匹配。由于主键值是唯一的,因此它们通常可以准确地标识一个源行和一个目标文档。验证引擎逐字段比较每个匹配对。如果对不匹配,验证引擎将报告每个差异。
在某些情况下,多行或文档共享相同的主键值。例如,当验证引擎展开嵌入数组时,每个数组元素都共享其父文档的主键值。如果多行不匹配的行或文档共享相同的主键值,验证引擎将不会尝试将其们配对。相反,它会报告不匹配的行和文档数量,并显示一个代表性源行和目标文档的计算差异。
在这两种情况下,验证引擎都会日志一组完整的主键值,以便您定位受影响的数据。
验证假设
数据验证假设源数据在迁移作业开始后不会改变,并且目标集合只包含迁移的数据。如果任何一个假设不正确,验证引擎可以报告不是迁移错误的不匹配:
如果在迁移作业开始之前目标集合包含数据,则验证引擎会将预先存在的文档报告为意外文档。
如果在迁移作业开始后源数据发生变化,则验证引擎会报告变更行与迁移文档之间的不匹配。
限制
数据验证会显著增加迁移作业的计算时间。验证引擎在数据库、作业、集合和字段级别也有限制。
支持的数据库
数据验证支持以下源数据库:
PostgreSQL
Oracle
MySQL
SQL 服务器
不支持的配置
当 migrator.job.allow.null.join 用户属性设置为 true 时,数据验证无法运行。SQL 比较中的空值不匹配,因此验证引擎停止并在 Job Update Log 窗格中报告错误。
跳过的集合
在以下情况下,验证引擎会跳过集合:
源表没有主键,或一个或多个主键字段未映射。验证引擎使用主键值批量检索行。
该集合使用数组条件。要了解更多信息,请参阅嵌入式数组。
该集合使用带行数限制的表过滤器。如果没有
ORDER BY子句,则过滤器选择的行不是确定性的。要应用可验证的行数限制,请向过滤器的 SQL 声明添加ORDER BY子句和LIMIT子句。
跳过字段
在以下情况下,验证引擎会跳过字段:
该字段是计算字段。要了解更多信息,请参阅计算字段。
字段的源列类型为
INTERVAL。该字段的目标类型不是
BOOL、DATE、DECIMAL、INTEGER、LONG或STRING。例如,验证引擎会跳过ObjectId字段。