同步脚本按 limit 1000 offset N 翻页,跑到第 60 页时源表新插了 200 条。最后目标表比源表少 200 行,还多出一批重复。碰到这种情况,我一般先确认改动有没有真的生效。

原因不复杂,offset 是按当前结果集位置算的,前面的行有增删,后面每页的起点就整体平移。翻页期间源表一直在写,页与页之间会出现重叠和空洞。分页按什么排序也有影响,非唯一列排序时顺序本身就不稳定。

碰到「分页同步漂移」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。报错里带路径的,先去看那个路径在不在、权限对不对。

SELECT id, order_no FROM orders
WHERE id > 9021000
ORDER BY id LIMIT 1000;

同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。

具体做法是,改成按主键游标 where id 大于 last_id order by id limit 1000;同步期间源表照常写入 游标只往前不回头;每页把 last_id 写进检查点 断了从这继续;跑完用 count 和最大 id 两头核对。

最后用这个标准收尾,目标表行数和源表一致 最大 id 相同 没有重复主键。

作者 9823189