对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Docs 菜单

数据验证

数据验证检查迁移作业是否准确迁移了您的数据。验证引擎连接到源数据库和目标数据库,并将迁移的文档与源数据进行比较。验证引擎验证以下内容:

  • 字段名称

  • 数据类型

  • 字段路径

  • Values

一次性迁移作业默认运行数据验证。要了解如何为作业启用或禁用验证,请参阅 使用数据验证。

注意

本页介绍 Relational Migrator 1.18 或更高版本中的验证引擎。早期版本仅检查主键值、验证较窄的模式范围并运行较慢。要使用这些验证功能,请升级到 1.18 或更高版本。

对于迁移作业中的每个集合,验证引擎完成以下步骤:

  1. 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.

  2. 使用源表的主键以批处理方式从源数据库中检索行,并将每个源列映射到集合中对应的字段路径(Field Path)。

  3. 从目标集合中检索具有相同主键的文档。验证引擎会展开并平展这些文档,以便将每个字段值与对应的源列值进行比较。

  4. 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

  • 该字段的目标类型不是 BOOLDATEDECIMALINTEGERLONGSTRING。例如,验证引擎会跳过 ObjectId 字段。