ALTER TABLE orders MODIFY id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT; SELECT AUTO_INCREMENT FROM information_schema.tables WHERE table_name = 'orders';
插入报 1062 Duplicate entry '4294967295' for key 'PRIMARY',表用的是 int unsigned 自增主键,最大值已经用满。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:int unsigned 的上限是 42 亿,自增计数器到顶后不再增长,新插入一律拿同一个最大值。应用侧看到的是主键冲突,不是自增失败。
「自增主键用尽」确认了原因之后,改动尽量只碰那一处,顺手改的东西后面最容易出问题。同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
把这次用到的命令存进笔记,比记住结论有用,换个环境还能照着走。改完隔一天再看一次,当场正常不代表能稳住。
处理上按这个顺序:先把列类型改成 bigint unsigned 需要重建表 挑低峰做;改之前确认关联表的外键列也一起改 否则约束会拦;历史数据量大的表用 gh-ost 迁 避免长时间锁表;给自增使用率加监控 到 70% 就报警。
确认没问题再收工,插入恢复正常 自增使用率回落到安全区间 新 id 不再撞车。
