迁移完数据后写入报 duplicate key value violates unique constraint users_pkey,Key 10001 已经存在。日志里能对上时间点,这种反而好排。
数据带 id 直接导进去,序列还停在初始值,nextval 给出来的号早被占用,主键自然撞车,重试多少次都没用。这一点先确认清楚,后面就不用反复试。
SELECT last_value FROM users_id_seq;
SELECT max(id) FROM users;
SELECT setval('users_id_seq', (SELECT max(id) FROM users));
围绕「PG 序列不同步」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
日志级别临时调高可以,记得改回去,长期开着既占磁盘又掩盖真问题。权限不要一口气开到最大,先加到够用再往上试,范围小才好收。
把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
处理上按这个顺序:先把序列当前值和表里最大 id 摆在一起比一比;用 setval 把序列推过表里最大 id,留一点余量;确认是自增列,且迁移期间没有别的程序在写这张表。
结果对不对很好判断,连续插入 100 条都能拿到新 id,主键冲突不再出现。
