MySQL 8.0 新特性之自增变量持久化

news2024/10/6 15:31:05

MySQL 8.0 新特性之自增变量持久化

文章目录

  • MySQL 8.0 新特性之自增变量持久化
    • MySQL 5.7 vs 8.0 测试对比
      • MySQL 5.7
      • MySQL 8.0
    • 参考资料

MySQL 8.0 中支持自增变量持久化,实际也是解决之前版本中存在的自增主键重启重置的 BUG 问题( BUG #199:Innodb autoincrement stats los on restart) 。

MySQL 8.0 开始,当前最大的自增计数器每当发生变化,值会被写入 redo log 中,并在每个检查点时保存在 engine-private system table 中,对 AUTO_INCREMENT 值进行持久化,MySQL 重启后,该值也不会改变。

MySQL 5.7 vs 8.0 测试对比

MySQL 5.7

# MySQL 5.7
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  4 |    2 |   11 |   22 |
+----+------+------+------+
4 rows in set (0.01 sec)

# 对应自增值(AUTO_INCREMENT)为 5
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

# 修改主键值
mysql> update t2 set id=5 where id=4;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  5 |    2 |   11 |   22 |
+----+------+------+------+
4 rows in set (0.00 sec)

# 自增值(AUTO_INCREMENT)未发生变化
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

# 插入数据,此时报错“主键冲突”
mysql> insert into t2 (c1,c2,c3) values (3,11,12);
ERROR 1062 (23000): Duplicate entry '5' for key 'PRIMARY'

# 再次查看自增值(AUTO_INCREMENT)已变为 6
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

# 测试再次插入数据,此时正常
mysql> insert into t2 (c1,c2,c3) values (3,11,12);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  5 |    2 |   11 |   22 |
|  6 |    3 |   11 |   12 |
+----+------+------+------+
5 rows in set (0.00 sec)

# 自增值(AUTO_INCREMENT)此时变为 7
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `c1` int(11) DEFAULT NULL,
  `c2` int(11) DEFAULT NULL,
  `c3` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

MySQL 8.0

# MySQL 8.0
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  4 |    2 |   11 |   22 |
+----+------+------+------+
4 rows in set (0.01 sec)

# 对应自增值(AUTO_INCREMENT)为 5
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` int DEFAULT NULL,
  `c2` int DEFAULT NULL,
  `c3` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

# 修改主键值
mysql> update t2 set id=5 where id=4;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  5 |    2 |   11 |   22 |
+----+------+------+------+
4 rows in set (0.00 sec)

# 查看自增值(AUTO_INCREMENT)已变为 6
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` int DEFAULT NULL,
  `c2` int DEFAULT NULL,
  `c3` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

# 再次修改主键值
mysql> update t2 set id=8 where id=5;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  8 |    2 |   11 |   22 |
+----+------+------+------+
4 rows in set (0.00 sec)

# 查看自增值(AUTO_INCREMENT)已变为 9
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` int DEFAULT NULL,
  `c2` int DEFAULT NULL,
  `c3` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

# 插入数据正常
mysql> insert into t2 (c1,c2,c3) values (3,11,12);
Query OK, 1 row affected (0.00 sec)
mysql> select * from t2;
+----+------+------+------+
| id | c1   | c2   | c3   |
+----+------+------+------+
|  1 |    1 |   11 |   22 |
|  2 |    2 |   22 |   33 |
|  3 |    2 |   22 |   25 |
|  8 |    2 |   11 |   22 |
|  9 |    3 |   11 |   12 |
+----+------+------+------+
5 rows in set (0.00 sec)

# 查看自增值(AUTO_INCREMENT)正常变为 10
mysql> show create table t2\G
*************************** 1. row ***************************
       Table: t2
Create Table: CREATE TABLE `t2` (
  `id` int NOT NULL AUTO_INCREMENT,
  `c1` int DEFAULT NULL,
  `c2` int DEFAULT NULL,
  `c3` int DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.01 sec)

参考资料

【1】AUTO_INCREMENT Handling in InnoDB

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2192231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

思维导图工具,轻松搞定复杂问题!

一提到思维导图,想必大家都不会陌生;它能帮助我们更好地梳理思路,让复杂的想法变得清晰可见;而随着互联网的普及,在线思维导图工具更是成为了我们日常工作和学习的得力助手;今天,我就来给大家推…

深入解析DPU:AI时代的芯片分工与超级网卡

引言 在当今AI时代,计算需求的爆炸性增长使得传统数据中心的架构面临着巨大的挑战。数据处理任务越来越复杂,尤其是在大型AI模型如GPT和BERT的应用中,如何提高数据中心的计算和传输效率成为关键问题。传统的CPU(中央处理器&#…

从零开始讲PCIe(10)——事务层介绍

一、事务层概述 事务层在响应软件层的请求时,会生成出站数据包。同时,它也会检查入站数据包,并将其中包含的信息传递到软件层。事务层支持非发布事务的分割事务协议,能够将入站的完成数据包与之前传输的非发布请求相关联。该层处理…

开发人员智能助手

据说AI可以代替开发人员,目前看暂时不用担心,不仅不担心,还要主动使用它。 过去有了问题需要自己各网站搜索,真真假假的东西太多,很难找到正确答案,现在可以问智能体了: 1、JAVA开发大师 htt…

【C++】输入输出缺省参数

大家好,我是苏貝,本篇博客带大家了解C的缺省参数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️ 目录 一. 输入&输出二. 缺省参数1 缺省参数概念2 缺省参数分类a. 全缺省参数b. 半缺省参数…

Top4免费音频剪辑软件大比拼,2024年你选哪一款?

现在我们生活在一个数字化的时代,音频内容对我们来说很重要。不管是给自己拍的视频配背景音乐、整理开会时的录音,还是自己写歌,有个好用的音频剪辑软件都特别重要。今天,我要给大家介绍几款特别好用的音频剪辑软件免费的&#xf…

Vue82 路由器的两种工作模式 以及 node express 部署前端

笔记 对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。hash模式: 地址中永远带着#号,不美观 。若以后将地址通过第三方手机app分享…

教育技术革新:SpringBoot在线教育系统开发

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所,二十一世纪是信息的时代,所以信息的管理显得特别重要。因此,使用计算机来管理微服务在线教育系统的相关信息成为必然。开…

【性能测试】使用JMeter性能工具做测试的基本过程及案例分析

前言 通过精心设计的性能测试,我们不仅能够了解服务端的综合效能与承载极限,更能前瞻性地评估现有业务架构在面对当前运营需求及未来业务扩张时的适应性与弹性,从而精准规划服务配置的优化路径。 使用jmeter一般用于以下两种类型的性能测试…

Dart基础入门

Dart 是一种由 Google 开发的开源编程语言,它可以用来构建服务器、Web 应用和移动应用。Dart 语言设计得既现代化又易于学习,它支持面向对象编程(OOP)、函数式编程风格,并且具有类似于 Java 或 C# 的语法。Dart 语言和…

性能测试学习2:常见的性能测试策略(基准测试/负载测试/稳定性测试/压力测试/并发测试)

一.基准测试 1)概念 狭义上讲:就是单用户测试。测试环境确定后,对业务模型中的重要业务做单独的测试,获取单用户运行时的各项性能指标。 广义上:是一种测量和评估软件性能指标的活动。可以在某个时刻通过基准测试建立…

[MASM] masm32的下载及详细安装使用过程(附有下载文件)

目录 下载 配置环境 编译 链接 masm的安装和环境配置 下载链接在文末 下载 下载安装包后复制到虚拟机win7系统的桌面 win7安装到虚拟机的步骤: [win7] win7系统的下载及在虚拟机中详细安装过程(附有下载文件)-CSDN博客 双击压缩包&…

微信消息转发(微信消息转发方案的取舍)

机构可能会有很多的粉丝群,老师有很多家长群,比如发送通知 如果一个个的群发送那么就很繁琐。所以就有一键群发的需求。只需要在一个群发送内容主动同步到其他群。 微信消息转发方案取舍 方案1. 因为微信有本地数据库SQLite, 消息会保存到本…

Redis安装RedisBloom插件

Redis安装RedisBloom插件 1. 下载RedisBloom2. 安装RedisBloom3. Redis 安装RedisBloom4. 验证是否安装成功5. 其他安装方法5.1 使用 Docker 安装 RedisBloom5.2 通过 RedisStack 安装 RedisBloom 是一个 Redis 模块,它提供了一种高效的方式来存储和检索大数据集中的…

频繁full gc问题排查及解决

为什么我们要对频繁full gc的情况进行处理---》频繁full gc会导致stw,影响用户体验。 (1)先进行问题的排查 如果频繁full gc 会报警,公司有自己的监控平台,可以查看full gc的情况 如果公司没有自己的监控平台&#…

爬虫案例——爬取情话网数据

需求: 1.爬取情话网站中表白里面的所有句子(表白词_表白的话_表白句子情话大全_情话网) 2.利用XPath来进行解析 3.使用面向对象形发请求——创建一个类 4.将爬取下来的数据保存在数据库中 写出对应解析语法 //div[class"box labelbo…

【实战篇】自增主键为什么不是连续的?

背景 由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。 之前我见过有的业务设计依赖于自增主键的连续性,也就是说,这个设计假设自增主键是连续的。但实际上,这样的假设是错的&#…

Linux高阶——Github本地仓库与云端仓库关联

1、安装代理软件 steam 选择Github和系统代理模式,一键加速即可 2、 安装Git 3、访问Github网站,创建新用户 4、Github探索 (1)Explore探索标签 (2)工程结构 用户名/仓库名 自述文件,用markdo…

C语言复习概要(三)

本文 使用Visual Studio进行调试的技巧与函数递归详解1. 引言2. Visual Studio 调试技巧2.1. 断点的使用2.1.1. 基本断点示例:设置基本断点 2.1.2. 条件断点示例:条件断点 2.2. 逐步执行代码示例:逐步执行代码 2.3. 监视变量使用监视窗口 2.4…

希捷8T硬盘exfat变0字节的恢复方法

最近流行的3.5寸大容量台式硬盘移动盒子是一种性价比较高的组合,为了方便如涉及到跨平台(win和mac),大多数此类组合选择了exfat文件系统。下边这个案例就是我们经常遇到的exfat变0字节。 故障存储: ST8000HKVS002 8T/exfat 文件…