关于sync-diff-inspector校验的一个问题

使用sync-diff-inspector进行数据校验,会导致报错、退出或者结果不准确的操作为?

Check-struct-only和 export-fix-sql同时设置为true
表创建以来从来没有手动收集过统计信息
使用 sync-diff-inspector 校验表中的json 列
一端为MySQL数据库,另一端为TiDB数据库,两端复制暂停

感觉前三个答案都可能导致报错、退出或者结果不准确

感觉是第一个吧

这个对比是基于数据做分片的,应该和统计信息没关系

正确答案是第一个

第一个答案比较靠谱啊

check-struct-only:仅校验表结构,不要和 export-fix-sql 同时开启

Check-struct-only是指仅校验表结构,export-fix-sql是仅生成修复 SQL,两个只能开启一个,二选一

好的好的

1 个赞

导致 sync-diff-inspector 报错、退出或结果不准确的操作分析

  1. 表创建以来从未手动收集统计信息
  • 风险 :导致 chunk 划分失败,触发index out of range报错,甚至程序退出。
  • 原因 :当表行数超过 50000 行时,sync-diff-inspector 会优先使用 TiDB 的stats_buckets统计信息进行 chunk 划分。若未手动收集统计信息,stats_buckets可能缺失或包含无效值(如特殊字符、NULL),导致工具在解析边界条件时出错

。* 案例 :零售资格项目中,未收集统计信息的表在校验时触发index out of range错误,需通过添加range="(TRUE)"参数规避,但会显著增加资源消耗和执行时间

  1. 使用 sync-diff-inspector 校验表中的 JSON 列
  • 风险 :导致校验结果不准确,工具无法正确对比 JSON 类型数据。

  • 原因 :sync-diff-inspector 不支持 JSON、BIT、BINARY、BLOB 等类型的数据校验,若未通过ignore-columns参数忽略这些列,会导致对比逻辑失效,输出错误的差异报告

  • 建议 :在校验配置中添加ignore-columns = ["json_column_name"],跳过 JSON 列的检查

  1. Check-struct-only 和 export-fix-sql 同时设置为 true
  • 风险 :可能导致修复 SQL 生成逻辑冲突,引发不可预期的报错。

  • 原因check-struct-only=true仅对比表结构,不校验数据;而export-fix-sql=true要求生成数据修复 SQL。两者同时启用时,工具可能因逻辑矛盾(如无数据差异却尝试生成修复 SQL)触发异常

  • 注意 :官方文档中未明确禁止该组合,但实际使用中存在潜在风险,建议避免同时启用

  1. 一端为 MySQL,另一端为 TiDB,两端复制暂停
  • 风险 :若暂停期间仍有数据写入,会导致校验结果不准确;若已停止写入,则可安全校验。

  • 原因 :sync-diff-inspector 不支持 MySQL 与 TiDB 的在线校验,需确保校验期间无数据变更。若复制暂停后仍有写入操作,会导致上下游数据不一致,校验结果失真

  • 建议 :校验前需停止所有写入操作,或通过range参数限定校验范围,确保数据静态一致

辅助信息

  • 统计信息缺失的临时解决方案 :在配置文件中添加range="(TRUE)",强制工具使用随机采样而非stats_buckets进行 chunk 划分,但会增加资源消耗和执行时间

  • JSON 列校验的替代方案 :通过业务逻辑手动对比 JSON 数据,或使用ignore-columns跳过 JSON 列后,单独校验其他字段的一致性

  • 官方限制文档sync-diff-inspector 使用限制

1 个赞

应该是的

1 个赞

前三 是 导致不准确的操作行为, 答案 abc

1 个赞

Check-struct-only 和 export-fix-sql 同时设为 true

1 个赞