INSERT INTO dst_account_flow (id, order_no, amount, dt)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE amount = VALUES(amount);

同步任务在第 40 万行报连接超时,运维直接重跑。目标表 account_flow 的金额合计从 1200 万变成 2400 万。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:写入用的是普通 insert,没有唯一键也没有覆盖逻辑。任务从头再跑一遍,前 40 万行就被写第二次。失败点没有记录,重跑只能整批来。

围绕「同步重跑不幂等」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。

新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。

处理上按这个顺序:给目标表建业务唯一键 用源表主键加分区日期;写入改成 insert on duplicate key update 只更新可变列;每批提交后记检查点 重跑从断点开始;重跑前先按检查点清理半成品数据。

确认没问题再收工,同一批重跑三次 目标表行数和金额合计都不变。

作者 9823189