INSERT INTO users (id, phone, name) VALUES (7,'13800138000','lee') ON DUPLICATE KEY UPDATE name = VALUES(name); SHOW WARNINGS;
做数据同步时用了 INSERT IGNORE,跑完提示影响 0 行,但目标表少了 2000 条。查下来是被外键约束和超长字段挡掉的,全被当成重复忽略了。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:INSERT IGNORE 把所有可忽略的错误都降级成警告,不只唯一键冲突,数据截断和外键失败也一并不报。影响行数只统计真正插入的行,少了多少看不出来。
围绕「insert ignore 副作用」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:把 INSERT IGNORE 换成 ON DUPLICATE KEY UPDATE 只处理唯一键冲突;同步前先 select 出冲突的键 单独核对一遍;打开 strict 模式 让截断直接报错;用 show warnings 看被降级的错误条目。
确认没问题再收工,同步完成后源表和目标表条数一致 冲突行有更新记录 不再有静默丢数据。
