MySQL 8 和 MySQL 5.7 在自增计数上的区别
MySQL 8 和 MySQL 5.7 在自增计数上的区别
作者:Arunjith Aravindan
本文来源:Percona 博客,爱可生开源社区翻译。
本文约 900 字,预计阅读需要 2 分钟。
Auto-Increment
自增(Auto-Increment)计数功能可以为主键列生成唯一值,这是数据库的一种设计。与 MySQL 5.7 相比,MySQL 8 为自增功能做了一项重要的升级。这个升级可以确保自增计数器的最大值在服务器重启后保持不变,从而为数据一致性和可靠性提供了更好的保障。在本文中,我们将对比 MySQL 5.7 和 MySQL 8 的不同之处,并提供实际示例来展示两者的区别。
MySQL 5.7 的自增
在 MySQL 5.7 中,自动增计数器的工作机制如下:当向包含自增列的表中插入新的一行数据时,计数器会自动加 1,生成的数值会作为插入行的主键使用。这个计数器值仅保存在内存中,在服务器重启后无法持久化。因此,如果服务器崩溃或重启,计数器可能会重置为一个较低的值。
MySQL 8 的自增持久化
随着 MySQL 8 的发布,自增计数器机制有了显著改进。在 MySQL 8 中,自增计数器的最大值现在可以在服务器重启后持久化。这意味着,即使服务器重启,自增计数器也会从上次结束的地方恢复,以确保自增主键的值保持连续。
示例对比
让我们用一个简单的例子来说明 MySQL 5.7 和 MySQL 8 在持久自增计数器方面的区别。我们将创建一个名为 users 的表,用于存储用户信息。
在 MySQL 5.7 中建表。
mysql> select version();
+-----------+
| version() |
+-----------+
| 5.7.42-46 |
+-----------+mysql> CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL
);
Query OK, 0 rows affected (0.02 sec)
在表中插入三条数据,可以查看到。
mysql> INSERT INTO users (username) VALUES ('user1');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO users (username) VALUES ('user2');
Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO users (username) VALUES ('user3');
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
+----+----------+
3 rows in set (0.00 sec)
我们继续删除一条记录并插入一条新记录。
mysql> delete from users where id=3;
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.00 sec)mysql> INSERT INTO users (username) VALUES ('user4');
Query OK, 1 row affected (0.01 sec)
删除 ID 为 3 的记录和插入新记录后,与预期一致,我们观察到新记录的 ID 为 4。
mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 4 | user4 |
+----+----------+
3 rows in set (0.00 sec)
现在,我们从 users 表中删除最后一条记录(ID=4),重启服务器,并检查表内容。
mysql> delete from users where id=4;
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.00 sec)service mysql restartmysql> select * from users;
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 2
Current database: db1+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.01 sec)
表中只剩下两条记录。我们插入第五条记录,判断它是否采用 ID 5,还是回退为ID 3。
mysql> INSERT INTO users (username) VALUES ('user5');
Query OK, 1 row affected (0.00 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 3 | user5 |
+----+----------+
3 rows in set (0.00 sec)
因此,在 MySQL 5.7 中,重启会导致自动增长计数器重置为较低的值,从而使新的记录插入时采用 ID 3。
MySQL 8 的解决方案
MySQL 8 解决了在服务器重启时 InnoDB 存储引擎出现的自增计数器丢失的问题。这项增强可以确保自增计数器的值在服务器重启后持久化,从而保证主键生成的一致性。
在 MySQL 8 中建表。
mysql> select version();
+-------------------------+
| version() |
+-------------------------+
| 8.0.33-0ubuntu0.22.04.2 |
+-------------------------+
1 row in set (0.00 sec)mysql> CREATE TABLE users (-> id INT AUTO_INCREMENT PRIMARY KEY,-> username VARCHAR(50) NOT NULL-> );
Query OK, 0 rows affected (0.04 sec)
在表中插入三条数据,可以查看到。
mysql> INSERT INTO users (username) VALUES ('user1');
Query OK, 1 row affected (0.07 sec)mysql> INSERT INTO users (username) VALUES ('user2');
Query OK, 1 row affected (0.02 sec)mysql> INSERT INTO users (username) VALUES ('user3');
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
+----+----------+
3 rows in set (0.00 sec)
接下来,删除一条并插入一条。
mysql> delete from users where id=3;
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.00 sec)mysql> INSERT INTO users (username) VALUES ('user4');
Query OK, 1 row affected (0.01 sec)
删除 ID 为 3 的记录和插入新记录采用 ID 为 4。
mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 4 | user4 |
+----+----------+
3 rows in set (0.00 sec)
删除最后一条记录(ID=4)后,重启服务器并查看表。
mysql> delete from users where id=4;
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.00 sec)service mysql restartmysql> select * from users;
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id: 8
Current database: db1
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
+----+----------+
2 rows in set (0.02 sec)
重启后,users 表中只保留两条记录。在 MySQL 8 中,插入新记录时,如预期那样采用 ID=5。
mysql> INSERT INTO users (username) VALUES ('user5');
Query OK, 1 row affected (0.01 sec)mysql> select * from users;
+----+----------+
| id | username |
+----+----------+
| 1 | user1 |
| 2 | user2 |
| 5 | user5 |
+----+----------+
3 rows in set (0.00 sec)
总结
MySQL 8 之前版本中的 InnoDB 存储引擎报告的自增计数器问题可能会导致困惑和数据不一致,特别是在服务器重启期间。计数器的值可能丢失,导致自动生成的主键值不匹配。MySQL 8 通过保证自增计数器在服务器重启之间持久化来解决这个问题。
通过升级到 MySQL 8,开发者可以利用这个功能创建更加坚实的应用程序,可以管理不同的故障情况而不影响数据完整性。
https://www.percona.com/blog/auto-increment-counter-persistence-in-mysql-8-comparing-the-evolution-from-mysql-5-7/
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
爱可生开源社区的 SQLE 是一款面向数据库使用者和管理者,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL 审核工具。
SQLE 获取
| 类型 | 地址 |
|---|---|
| 版本库 | https://github.com/actiontech/sqle |
| 文档 | https://actiontech.github.io/sqle-docs/ |
| 发布信息 | https://github.com/actiontech/sqle/releases |
| 数据审核插件开发文档 | https://actiontech.github.io/sqle-docs/docs/dev-manual/plugins/howtouse |
相关文章:
MySQL 8 和 MySQL 5.7 在自增计数上的区别
MySQL 8 和 MySQL 5.7 在自增计数上的区别 作者:Arunjith Aravindan 本文来源:Percona 博客,爱可生开源社区翻译。 本文约 900 字,预计阅读需要 2 分钟。 Auto-Increment 自增(Auto-Increment)计数功能可以…...
Linux系统之links和elinks命令的基本使用
Linux系统之links和elinks命令的基本使用 一、links与elinks命令介绍1. links命令简介2. elinks命令简介 二、links与elinks命令区别三、links命令选项解释四、links命令的基本使用1. links安装2. 查看links版本3. 图形模式打开网址4. 直接使用links命令5. 打印url版本到标准格…...
【00】FISCO BCOS区块链简介
官方文档:https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/introduction.html FISCO BCOS是由国内企业主导研发、对外开源、安全可控的企业级金融联盟链底层平台,由金链盟开源工作组协作打造,并于2017年正式对外开源。 F…...
NPDP产品经理认证怎么报名?考试难度大吗?
PMDA(Product Development and Management Association)是美国产品开发与管理协会,在中国由中国人才交流基金会培训中心举办NPDP(New Product Development Professional)考试,该考试是产品经理国际资格认证…...
免杀技术,你需要学习哪些内容
免杀技术,你需要学习哪些内容? 什么是免杀? 免杀是指通过各种技术手段使恶意软件或病毒能够逃避杀毒软件的检测和阻止,成功地感染目标系统。免杀技术是黑客和恶意软件开发者常用的手段之一,用于隐藏恶意代码并绕过安…...
odoo16 取消“系统各功能状态日报”的邮件
odoo16默认情况下每周都会发送一个“系统各功能状态日报”的邮件,而且是所有人都发, 这个功能在哪配置呢? 今天研究了一下, 线索是“系统各功能状态日报”,先全文检索吧 #. module: digest #: model:digest.digest,na…...
[C++ 网络协议] Windows中的线程同步
目录 1. 用户模式(User mode)和内核模式(Kernal mode) 2. 用户模式的同步(CRITICAL_SECTION) 3. 内核模式同步 3.1 互斥量 3.2 信号量 3.3 事件对象 4. 实现Windows平台的多线程服务器端 1. 用户模式(User mode)和内核模式(Kernal mode) Windows操作系统的运行方式是“…...
JavaScript 基础第三天笔记
JavaScript 基础第三天笔记 if 多分支语句和 switch的区别: 共同点 都能实现多分支选择, 多选1大部分情况下可以互换 区别: switch…case语句通常处理case为比较确定值的情况,而if…else…语句更加灵活,通常用于范围…...
NebulaGraph实战:3-信息抽取构建知识图谱
自动信息抽取发展了几十年,虽然模型很多,但是泛化能力很难用满意来形容,直到LLM的诞生。虽然最终信息抽取质量部分还是需要专家审核,但是已经极大的提高了信息抽取的效率。因为传统方法需要大量时间来完成数据清洗、标注和训练&am…...
一百八十二、大数据离线数仓完整流程——步骤一、用Kettle从Kafka、MySQL等数据源采集数据然后写入HDFS
一、目的 经过6个月的奋斗,项目的离线数仓部分终于可以上线了,因此整理一下离线数仓的整个流程,既是大家提供一个案例经验,也是对自己近半年的工作进行一个总结。 二、项目背景 项目行业属于交通行业,因此数据具有很…...
工具篇 | H2数据库的使用和入门
引言 1.1 H2数据库概述 1.1.1 定义和特点 H2数据库是一款以 Java编写的轻量级关系型数据库。由于其小巧、灵活并且易于集成,H2经常被用作开发和测试环境中的便利数据库解决方案。除此之外,H2也适合作为生产环境中的嵌入式数据库。它不仅支持标准的SQL…...
PHP脚本导出MySQL数据库
背景:有时候需要同步数据库的表结构和部分数据,同步全表数据非常大,也不适合。还有一个种办法是使用数据库的dump命令执行备份,无法进入服务器?没有权限怎么办? 这里只要能访问服务器中的 information_sch…...
生成随机单据号
背景:全局生成4位字符2222-9ZZ9 实现方式: 使用redis的原子自增 google的retry保证,生成4位数 1、pom <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><v…...
【计算机网络笔记五】应用层(二)HTTP报文
HTTP 报文格式 HTTP 协议的请求报文和响应报文的结构基本相同,由四部分组成: ① 起始行(start line):描述请求或响应的基本信息;② 头部字段集合(header):使用 key-valu…...
安装Python3.x--Windows
1 下载安装包 确定安装是干什么,要下哪个版本(如果是配置项目环境,最好按项目需求的版本来装) 1.1 官网链接 https://www.python.org 最新版本 指定版本 2 安装说明 点击下载exe,运行自定义安装路径,下…...
坐标休斯顿,TDengine 受邀参与第九届石油天然气数字化大会
美国中部时间 9 月 14 日至 15 日,第九届石油天然气数字化大会在美国德克萨斯州-休斯顿-希尔顿美洲酒店举办。本次大会汇聚了数百名全球石油天然气技术高管及众多极具创新性的数据技术方案商,组织了上百场硬核演讲,技术专家与行业从业者共聚一…...
labview 混合信号图 多曲线分组
如果你遇到了混合信号图 多曲线分组显示的问题,本文能给你帮助。 在文章的最好,列出了参考程序下载链接。 一个混合信号图中可包含多个绘图区域。 但一个绘图区域仅能显示数字曲线或者模拟曲线之一,无法兼有二者。 以下显示的分两组&#…...
客户端负载均衡_负载均衡策略
以前的Ribbon有多种负载均衡策略 RandomRule - 随性而为 解释: 随机 RoundRobinRule - 按部就班 解释: 轮询 RetryRule - 卷土重来 解释: 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试。 Weigh…...
使用Python+Flask/Moco框架/Fiddler搭建简单的接口Mock服务
一、Mock测试 1、介绍 mock:就是对于一些难以构造的对象,使用虚拟的技术来实现测试的过程mock测试:在测试过程中,对于某些不容易构造或者不容易获取的对象,可以用一个虚拟的对象来代替的测试方法接口mock测试&#x…...
【Vue】Mock.js介绍和使用与首页导航栏左侧菜单搭建
目录 一、Mock.js 1.1 mockjs介绍 1.2 mock.js安装与配置 1.2.1 安装mock.js 1.2.2 引入mock.js 1.3 mock.js的使用 1.3.1 准备模拟数据 1.3.2 定义拦截路由 1.3.3 测试 二、首页导航栏左侧菜单搭建 2.1 自定义界面组件 (完整代码) 2.2 配置路由 2.3 组件显示折叠和…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
springboot 百货中心供应链管理系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,百货中心供应链管理系统被用户普遍使用,为方…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
