迁移做了两周双写,切换前比对两边行数,新库比旧库少 128 条,校验任务日志里显示全部通过。乍看像缓存或者权限的锅,追下去往往不是。

SELECT id FROM old_db.t_order EXCEPT SELECT id FROM new_db.t_order;
SELECT count(*) FROM old_db.t_order;

追下去是这么回事:校验 SQL 按 create_time 取最近一小时的数据,漏掉的是夜间批量导入的历史单,时间落在窗口之外。校验又只比了总数没比主键集合,少 128 条和多 128 条会互相抵消。

「双写数据校验」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

先做最小复现,能稳定跑出来的问题,排查成本会低一个数量级。

具体做法是,校验范围按主键区间扫全量 不要只取时间窗口;比对主键集合差异 输出缺失和多余两份清单;漏写的入口逐个补 批量导入和后台改单都要走双写;切换前再跑一次全量比对 差异为 0 才放行。

验收就看一点,两次全量比对差异都是 0 缺失清单为空。

作者 9823189