mysql5.x自增id被重置问题

mysql5.x自增id被重置问题

May 5, 2023
mysql, 数据库
mysql, 自增id

问题描述 #

mysql版本:5.6。 引擎:InnoDB。

内网环境,测试一个旧业务时,发现自增id很小,此业务已上线很久,自增id应该很大了,于是怀疑是不是自增id被重置了。 经过和运维同事沟通,判断这是mysql自身的问题:重启之后,自增id被重置了。

问题分析 #

这其实是一个陈年老bug了: https://bugs.mysql.com/bug.php?id=199

在mysql8.0以前,自增id是存储在内存中的,没有做持久化存储。重启之后,在第一次插入记录时,会先获取自增列的最大值。如果没有记录,那么最大值就是0,然后再加1,就是1了。 而我这个例子中的这张表,会定时将数据迁移到历史表里。迁移后,原表中的数据就没有了,而恰恰内网数据库服务重启过,所以自增id被重置了。

在mysql8.0以后,自增id的最大值会持久化存储,重启之后,会从磁盘中获取最大值。

这个问题其实在mysql的官方文档中有说明:https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html。感兴趣的可以好好看看。