MySQL自增主键重复问题

  最近线上流量越来越大,所以对mysql进行了钞能力,钞能力之后就开始偶现了最近项目上出现一个表的主键(自动)重复的情况,真是见鬼了,这个表涉及到支付业务,导致部分业务无法支付,当场吓尿~~~

场景复现

  最近线上流量越来越大,所以对mysql进行了钞能力,钞能力之后就开始偶现了,不应该啊,钞能力还有副作用?肯定不是!接着回想,尼玛,前段时间因为安全隐私合规,对用户的一些数据进行了物理删除,所以钞能力之后就出现了问题!

原因分析

  mysql自增列未持久化!
  一查发现这居然是mysql很久以前的一个bug(哈哈哈,我不知道),简直的茅坑的石头,又臭又硬!这点从其在官方bug网站的id号也可看出(https://bugs.mysql.com/bug.php?id=199)。由Peter Zaitsev(现Percona CEO)于2003年提出。历史悠久且臭名昭著。

mysql 5.7及以前

  MySQL并不会将自增列分配的自增值信息固化到磁盘,是由InnoDB数据字典内部一个计数器来决定的,而该计数器只在内存中维护,并不会持久化到磁盘中。当MySQL重启后,会根据自增列上当前最大值来确定下一次的自增值,如果之前已经删除过 id=100 的数据,但是表中当前记录的最大值如果是 99,那么经过扫描,下一条记录的 id 是 100,而不是 101。

mysql 8.0

  MySQL8.0则是每次在变化的时候,都会将自增计数器的最大值写入 redo log,同时在每次检查点将其写入引擎私有的系统表。如果数据库发生重启,InnoDB会根据redo log中的计数器信息来初始化其内存值,所以不会出现自增主键重复的问题。

结论

  自增主键没有持久化的问题并不是很大,前提是不使用自增主键作为业务主键!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值