SELECT order_no, COUNT(*) c FROM src_order_detail GROUP BY order_no HAVING c > 1 LIMIT 20;
目标表 order_no 上有唯一索引,同步第 7 批时报 1062 Duplicate entry 'SO20260301001' for key 'uk_order_no'。整批 5 万行一条没进去。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,多值 insert 在一个事务里执行,任何一行冲突都会让整个事务回滚。源库允许同一订单号有多条明细,目标表却按订单号建了唯一键,模型本身就没对齐。批量越大,一条脏数据的影响面越广。
「同步唯一键冲突」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。
处理上按这个顺序:先查清楚冲突行的来源 是源库重复还是历史脏数据;把唯一键改成订单号加明细号的联合唯一;写入用 insert ignore 前先确认业务能接受丢行;需要保留全部数据就改成 upsert 并记录冲突日志。
改完只确认一件事:冲突单号只在联合键维度上唯一 重跑整批 5 万行全部入库。
