首页/数据/数据工程与 ETL 速查/源目标对账校验方法
CDC 与同步53 条

源目标对账校验方法

同步校验常用三层:行数对账(分片统计)、主键集合比对(找缺失与多余)、按主键分桶的校验和/哈希比对。校验要按业务主键口径而非物理行数(软删除、重复行会干扰),大表分桶并行、缩窗比对,差异要能定位到主键范围。

源目标对账是什么

对账(一致性校验)用来回答「搬过来的数据和源端一样吗」。常用三层递进:行数对账做粗筛、主键集合比对找单侧缺失与多余、按主键分桶的校验和比对定位到差异范围。校验要按业务主键口径而不是物理行数(软删除、重复行、乱序都会干扰结论),大表分桶并行、按时间窗缩小范围,差异必须能定位到具体的主键区间才具备修复价值。

基本信息

适用场景数据同步、迁移、整库复制后的正确性验收
三层方法行数 → 主键集合 → 分桶校验和,逐层定位
分桶方式按主键取模或按范围分片,两侧用同一分桶规则
失败定位差异桶再按主键二分定位到具体键值范围
结果留存对账结果落表并保留历史,用于判断是首次还是反复出现

典型使用场景

  • 迁移验收:迁移完成后按表逐个出具对账结论
  • 日常巡检:核心表每天比对关键字段校验和,及早发现同步中断
  • 故障后核对:增量链路中断恢复后,确认中间缺失区间已被补齐
  • 回刷验收:回补任务完成后核对结果是否与预期一致
  • 口径排查:两侧数字不一致时判断是数据差异还是口径差异

行数与校验和(源端示例)

行数与校验和(源端示例)
-- 粗筛:行数 + 关键字段校验和(同一 SQL 在目标端执行后比对)
SELECT COUNT(1) AS cnt,
       BIT_XOR(CRC32(CONCAT_WS('#', order_id, CAST(amount AS CHAR), status))) AS sig
FROM dw.orders
WHERE update_time >= '2026-10-01' AND update_time < '2026-10-11';

-- 分桶校验和:桶号由主键取模得到,两侧规则必须完全一致
SELECT MOD(order_id, 16) AS bucket,
       COUNT(1) AS cnt,
       BIT_XOR(CRC32(CONCAT_WS('#', order_id, CAST(amount AS CHAR), status))) AS sig
FROM dw.orders
GROUP BY MOD(order_id, 16)
ORDER BY bucket;

主键集合比对

主键集合比对
-- 目标缺哪些主键(源有目标没有)
SELECT s.order_id FROM src_orders s
LEFT JOIN dw.orders t ON t.order_id = s.order_id
WHERE t.order_id IS NULL
LIMIT 100;

-- 目标多哪些主键(目标有源已删)
SELECT t.order_id FROM dw.orders t
LEFT JOIN src_orders s ON s.order_id = t.order_id
WHERE s.order_id IS NULL
LIMIT 100;

三层方法读法

层次能发现什么局限
行数整体缺失或翻倍,几秒即可得出结论行数相等仍可能有同数不同值
主键集合单侧缺失与多余的具体键只看键不看内容,字段错位查不出
分桶校验和同一批键里内容是否一致,并能缩小到桶桶内仍需二分;两侧函数与类型必须一致
抽样明细最终确认真实差异内容成本高,只对差异键执行
增量链路的对账要留出在途窗口:比对截止时间取「两侧都已处理完」的时刻,并排除正在写入的最新几分钟,否则延迟写入会被误判为缺失。
两侧的排序、字符集、类型转换与 NULL 处理必须完全一致,否则哈希天然不同,会产出大量假差异,反而掩盖真实问题。

易错点

  • 行数相等就判定一致,漏掉同数不同值(金额被覆盖、字段错位)
  • 两侧哈希函数、字段顺序或类型转换不一致,报告大量假差异
  • 比对窗口包含了在途写入,把正常的同步延迟误判为数据丢失
  • 用物理行数当口径标准,源端有软删除或多版本行时结论直接错误
  • 对账只跑一次不留存结果,无法判断问题是首次出现还是长期存在

数据来源与参考

  • MySQL 官方文档(CRC32 与聚合函数)
  • 行业数据对账与校验实践
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌