常见一致性校验问题

最近更新时间:2024-03-14 17:38:21

我的收藏

全量校验任务进度慢,耗时久

原因分析

云数据库 MongoDB DTS 一致性校验策略针对全量数据逐条对比,若校验对比的数据量较大时,校验任务持续时间可能非常长;同时校验任务进行期间会持续占用系统资源,可能对源端业务和迁移任务造成影响。

解决方法

针对数据量比较大,校验任务长期无法结束的情况,建议停止当前任务,重新手动创建一致性校验任务,数据校验方式选择行数校验进行快速对比;或者数据校验方式选择内容校验,同时降低抽样对比选择的比例,即抽取相对低比例的数据进行校验,提高校验效率。具体操作,请参见 创建数据一致性校验
数据校验
行数校验:对比源库和目标库的数据行数。
内容校验:逐条对比源库和目标库的数据内容。
抽样对比:选择内容校验时,支持抽取一定比例的数据进行对比。


数据对比不一致

数据内容不一致

问题现象

原因分析 全量数据校验过程中,源端数据持续写入,Oplog 不断产生,增量数据校验任务持续从源端读取 Oplog,若源端新产生的 Oplog 还没到达目的端的时间戳内,可能会存在短暂的数据内容对比不一致现象,此时属于正常情况。
解决方法 针对校验不一致的内容逐条进行判断,也可发起新校验任务,手动进行二次校验,当目标端追平增量时,该不一致内容将不再存在。

数据行数不一致

问题现象

原因一 全量数据校验过程中,源端数据持续写入,Oplog 不断产生,增量数据校验任务持续从源端读取 Oplog,若源端新产生的 Oplog 还没到达目的端的时间戳内,同样可能引起短暂的数据行数校验不一致现象,此时属于正常现象。
原因二 云数据库 MongoDB 行数校验是通过 db.collection.estimatedDocumentCount() 或 db.collection.stats() 采集元数据中的行数进行对比,其在特定情况下可能和实际行数有出入:如预期外的实例停机,或者孤儿文档都会造成不一致。
解决方法 此时,您可以使用 db.collection.countDocuments() 进行精准的行数比较。但需注意此方法会扫描集合,有一定性能风险。更多信息,请参见 db.collection.countDocuments()

索引校验

问题描述 创建一致性校验任务时,若数据库信息选择了索引,即对比源端与目的端的索引。如果您发现源端与目的端存在 “v” 字段与 “background” 字段内容存在差异,而校验结果并没有提示不一致的信息。
原因说明 云数据库 MongoDB 索引校验策略是忽略版本信息:“v” 字段的和后台创建:“background” 字段的内容差异,将不会在校验结果中显示该不一致的信息。