阿里云 RDS mysql5.7 , 一个几百行的表,突然一条插入的记录自增 ID 成了 2147483647 ,已经排除了无限循环错误写入导致的 ID 自增溢出,或者在插入时错误的带入 ID 值,还有什么可能原因么?
![]() |
1
rlds 33 天前
你可能需要关注下这个
[img]https://pic2.ziyuan.wang/user/rainerosion/2025/03/1741311183908_c8898ad81d69c.png[/img] |
![]() |
2
rlds 33 天前
咦,v2 的图片咋显示的来着,,没显示。。
|
![]() |
3
youngforever 33 天前
用了 INSERT INTO ON DUPLICATE KEY UPDATE 或者 REPLACE INTO ,如果调用频率很高,id 也会变的很大
|
![]() |
5
shenjinpeng 33 天前
也可以检查一下程序是不是出 bug 写入了 big int id
|
6
iyiluo 33 天前 ![]() 开 general log 日志,重新复现一下,看看日志里面有没有踪迹
|
7
jifengg 33 天前
一种可能:之前写入过 id=2147483647 或 2147483646 的数据,又删掉了数据,但是这个表的下次自增值已经变成 2147483647 了
|
8
layxy 33 天前
看下 binlog 记录
|
9
dcsuibian 33 天前
我分析了一下:
首先,MySQL BUG 不太可能,5.7 又不是什么新版本,有的话早就被人发现了 其次,sb 同事插入了手动插入了一条 2147483646 的数据,然后删除,可能性也非常低 以上两种排除了以后,基本就可以认为是程序错误导致的插入 就我的经验来说最有可能的是之前插入过,然后删除或回滚了 我估计题主的技术栈是 Java+MyBatis 那出现错误的代码我觉得很有可能是这样的: for(int i=0;i<XXX;i++){ save(); // 插入 } 因为某些 BUG ,所以导致这个 XXX 是 Integer.MAX_VALUE ,有可能是在寻找最小索引或最小值的时候出了问题 |
10
vm97 OP 感谢各位回复,之前偷懒日志没配置好,我先把日志弄好。确实也怀疑是循环错误写入导致的 ID 爆了,但是库里没记录,也没相关的代码逻辑,包括 mybatis 的日志也未发现异常。我先配好 mysql 日志再观察下
|
![]() |
11
Karte 33 天前 ![]() 可能是你的 MyBaits 上没有 @TableId(value = "id", type = IdType.AUTO).
有些时候 mybaits 会根据策略自动对 ID 进行赋值, 而不是使用自增主键. |
![]() |
12
ktin 33 天前
有没有用 insert ignore
|
![]() |
13
Karte 33 天前
可以具体看下 com.baomidou.mybatisplus.core.MybatisParameterHandler#populateKeys.
如果我记得没错是这. |
14
snow0 33 天前
估计是 mybatis 的问题
|
![]() |
15
skymei 33 天前
如果写入了一条指定 ID 值超过上限的数据,也会变成这样
|
16
qianyan 33 天前
不知道你是什么原因,但如果是 mybatis-plus 注解了 TableId ,但没标记自增的话,会有这个问题的。
|
17
qindan 33 天前
改为 uuid 吧
|
![]() |
19
PaulSamuelson 33 天前
是不是谁把 dev 的 id 发到了 master 上?例如 dev curl 把地址一改,调到线上去了。
|
20
kphcdr 33 天前
用了事务,但是事务回滚,也会导致自增 ID 变大
|
21
skyyan 33 天前
纯 sql 吗 还是说用了 持久层框架,如果持久层框架 注意自增方式
|
![]() |
22
warrenwt 33 天前
看下你的 entity 里面的 id 有没有加自增注解
|
![]() |
23
FlorentinoAriza 33 天前
|
![]() |
24
FlorentinoAriza 33 天前
@FlorentinoAriza #23 只是随便选了张图片展示下,可不是广告奥
|
26
herm2s 33 天前
mybatis 的问题?或者谁手动设置了 AUTO_INCREMENT 的值?
|
![]() |
28
opengps 33 天前
有没有可能,某种报错一直在占用 id ,导致出现了最大值
|
29
Huelse 33 天前
@irisdev 自增 id 就是数据库维护了一个序列号表,你甚至可以改当前自增值`ALTER TABLE tbl AUTO_INCREMENT = 100;`
https://dev.mysql.com/doc/refman/8.0/en/example-auto-increment.html |
![]() |
30
TeslaLyon 33 天前
结案了吗?
|