MySQL8.0以下版本重启后自增主键值丢失问题

embedded/2024/10/21 21:31:58/

文章目录

  • 问题
  • 原因分析
      • MySQL8.0以下版本
      • MySQL8.0版本
      • MySQL5.7版本
  • 问题复现
    • MySQL 5.7.22
    • MySQL 8.0.23
  • 解决方案
    • 升级MySQL到8.0
    • 业务代码预防
  • 参考

问题

上周运维同学重启了UAT环境的MySQL数据库服务,刚开始我是不知道数据库重启了,先是业务服务开始异常,初步定位到的原因是一个表的主键ID出现了回退,又查到MySQL低版本(8.0以下)重启可能会导致自增主键值回退或重置,最后和运维同学确认了下重启时间,确认了原因。
因为生产环境使用的版本和UAT一致,所以生产环境一旦宕机或重启,也会出现这个问题,后果很严重,马上进行了复现并修复。

原因分析

MySQL8.0以下版本

Innodb引擎表的自增值是存放在内存中的,并没有持久化到磁盘。当服务重启后,会将表当前MAX(ID)+自增步长,作为当前表的自增值。这就是导致了一个问题:当存在DELETE数据的场景中,如果最大的自增主键的记录删除了,重启后自增值就会回退;如果表中的数据全被删除了,重启后自增值重置为配置的auto_increment_offset值, 默认为1
这个问题可能会对业务造成非常大的影响,但是却存在了很长时间,官方一直到MySQL8.0中才进行了修复。见MySQL5.7官方文档
在这里插入图片描述

MyISam引擎表的自增值是存放数据文件中的,重启后不会丢失。但因为MyISam不支持事务,所以企业基本使用的都是Innodb引擎。

MySQL8.0版本

MySQL8.0版本,自增值逻辑发生了变化。自增值会持久化到redo日志中当服务重启后,会将redo日志中的自增值和表当前MAX(ID)比较,取二者较大的值,再加自增步长作为当前表自增值。 保证自增值能够正确恢复。见MySQL8.0官方文档
在这里插入图片描述

MySQL5.7版本

既然有bug,那么为啥不升级到8.0呢?主要是因为MySQL5.7比较稳定+历史遗留问题。。。
MySQL5.7版本是在2015年发布的,距今已经有近10年的时间了。官方虽然已经在2023年10月已经停止运维了,但目前在企业中使用仍然广泛,占比46%,数据统计于2022年5月,链接、数据来源。
在这里插入图片描述

问题复现

用docker分别搭建了MySQL5.7.22版本和8.0.23版本,使用一个示例,复现问题。

MySQL 5.7.22

-- 1.创建user表,InnoDB引擎,自增主键为id列
CREATE TABLE `user` (`id` int(11)  NOT NULL AUTO_INCREMENT,`name` varchar(255) NOT NULL DEFAULT '',`sex` tinyint(4)  DEFAULT '0',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1;-- 2.插入5条数据
INSERT INTO `user`(`name`, sex) VALUES('user1', 0);
INSERT INTO `user`(`name`, sex) VALUES('user2', 0);
INSERT INTO `user`(`name`, sex) VALUES('user3', 0);
INSERT INTO `user`(`name`, sex) VALUES('user4', 0);
INSERT INTO `user`(`name`, sex) VALUES('user5', 0);-- 3.查看AUTO_INCREMENT,值为6 ,正常
show create table user; -- 4.删掉id=4,5的记录
delete from user where id > 3;-- 5.再次查看AUTO_INCREMENT,值为6 ,正常
show create table user; -- 6.重启服务
docker restart mysqld 
-- 7. 再次查看AUTO_INCREMENT,值为4,出现回退

重启MySQL服务前查看AUTO_INCREMENT
在这里插入图片描述
重启MySQL服务后查看AUTO_INCREMENT
在这里插入图片描述

MySQL 8.0.23

在MySQL8.0中,执行同样的操作,自增值仍为6,没有丢失,这里就不演示啦!但我在实际操作过程中,也遇到一个其他小问题。
查看自增值可以通过show create table 表名;也可以通过show table status from 数据库名 like 表名,查看表的一些元数据信息INFORMATION_SCHEMA ,原数据信息中一列为Auto_increment,表示自增值。
无论哪个版本,使用show create table查看,获取的AUTO_INCREMENT都是最新的。但是MySQL8.0版本使用show table status查看到AUTO_INCREMENT却不是最新的。这是由于在MySQL8.0版本中引入了缓存机制,如果想要查最新的AUTO_INCREMENT,需要设置缓存过期为0.

SET SESSION information_schema_stats_expiry = 0

在这里插入图片描述

解决方案

升级MySQL到8.0

正如前文中所说,这种方式复杂且风险很大,MySQL8.0并不完全兼容低版本,升级后这个问题解决了,但可能会导致其他方面的问题,所以生产环境一般是不会同意这样做的。

业务代码预防

踩中这个坑的主要原因,还是因为使用了DELETE 删除了最大自增主键的数据。我这里主要是数据量大需要及时清理,不得不删,一般都是先逻辑删除的,再定期清理。除了升级MySQL,还可以用业务代码预防。
如延迟删除最大的ID记录,最大的ID记录先不删,等到出现更大的ID,再把之前的ID删掉,本次我是用了这种方法。
如果业务场景的自增主键没有暴露给外部,丢失其实也没什么影响。又或者需要暴露给外部,可以新增一列UID,作为幂等键、唯一标识等等,不要直接使用主键ID。

使用业务代码预防,方法是很灵活的,可以根据具体场景具体分析。

参考

  • 官方5.7文档: https://dev.mysql.com/doc/refman/5.7/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization
  • 官方8.0文档:https://dev.mysql.com/doc/refman/8.0/en/innodb-auto-increment-handling.html#innodb-auto-increment-initialization
  • https://www.shadowserver.org/news/over-3-6m-exposed-mysql-servers-on-ipv4-and-ipv6/
  • https://roll.sohu.com/a/728274763_121124377
  • https://blog.csdn.net/Seky_fei/article/details/107756788

http://www.ppmy.cn/embedded/129370.html

相关文章

监控内容、监控指标、监控工具大科普

在现代信息技术领域,监控技术扮演着至关重要的角色。它帮助我们实时了解系统、网络、应用以及环境的状态,确保它们的安全、稳定和高效运行。以下是对监控内容、监控指标和监控工具的详细科普。 一、监控内容 监控内容是指监控系统所关注和记录的具体信…

企业成本与时间管理新策略 低代码自动化显身手

低代码自动化平台助力企业降本增效,加速数字化转型。ZohoCreator作为领先平台,提供可视化开发、丰富模板、自动化工作流等功能,广泛应用于招聘、制造、库存管理等行业,提升效率,降低成本。 一、什么是低代码自动化&…

Scrapy | 爬取笑话网来认识继承自Spider的crawlspider爬虫类

crawlspider 1. 创建crawlspider爬虫2. 实战-爬取笑话网笑话 本篇内容旨在拓展视野和知识,了解crawlspider的使用即可,主要熟悉掌握spider类的使用 CrawlSpider 提供了一种更高级的方法来定义爬取规则,而无需编写大量的重复代码。它基于规则…

VSCODE使用记录

1、文件或文件夹显示与搜索(一个工程,不是全局的) ①CtrlShiftP ②选择1,出现settings.json文件 ,把需要屏蔽搜索的文件配置里面 { "files.encoding": "gb2312","security.workspace.trus…

基于SSM+微信小程序的房屋租赁管理系统(房屋2)

👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序的房屋租赁管理系统实现了有管理员、中介和用户。 1、管理员功能有,个人中心,用户管理,中介管理,房屋信息管理&#xff…

SpringBoot构建的智能健康生活助手

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原理…

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架,JAVA作…

Win11安装WSL2,自定WSL2安装位置,安装到其他磁盘(非C盘)

参考: 【Linux】自定义WSL2安装位置,安装到其他磁盘(非C盘)_wsl2指定安装路径-CSDN博客 超详细Windows10/Windows11 子系统(WSL2)安装Ubuntu20.04(带桌面环境)_wsl安装ubuntu20.04-CSDN博客 旧版 WSL 的…