同步任务批量写入时经常中断,报唯一键重复,重跑还会卡在同一条。日志里能对上时间点,这种反而好排。

源数据存在重复记录,或并发写入时两个事务同时插入同一个唯一值。这一点先确认清楚,后面就不用反复试。

INSERT INTO t (id, name) VALUES (1, 'a')
ON DUPLICATE KEY UPDATE name = VALUES(name);
-- 或
INSERT IGNORE INTO t (id, name) VALUES (1, 'a');

「MySQL 唯一键冲突」改完先别急着全量,挑一台机器放半天,真有问题这段时间就能看出来。偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

改完顺手把文档补一句,省得下次自己重新推一遍。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

处理上按这个顺序:改用带忽略或更新的插入语法;按业务选择保留哪条;写入前先去重。

结果对不对很好判断,同步任务能完整跑完,重复数据按预期被更新而不是报错。

作者 9823189