MySQL 8.0自增变量的持久化问题小结

 更新时间:2024年11月13日 08:59:00   作者:kahnyao  
MySQL5.7中自增主键在重启后会重置,而MySQL8.0中通过重做日志持久化自增变量,避免重启后主键冲突,本文介绍MySQL 8.0自增变量的持久化问题小结,感兴趣的朋友一起看看吧

MySQL 8.0特性-自增变量的持久化

在MySQL 8.0之前,自增主键AUTO_INCREMENT的值如果大于max(primary key)+1,在MySQL重启后,会重置AUTO_INCREMENT=max(primary key)+1,这种现象在某些情况下会导致业务主键冲突或者其他难以发现的问题。 下面通过案例来对比不同的版本中自增变量是否持久化。

MySQL5.7测试

在MySQL 5.7版本中,测试步骤如下: 创建的数据表中包含自增主键的id字段,语句如下:

CREATE TABLE test1(
id INT PRIMARY KEY AUTO_INCREMENT
);
-- 插入4个空值,执行如下:
INSERT INTO test1
VALUES(0),(0),(0),(0);
-- 查询数据表test1中的数据,结果如下:
mysql> SELECT * FROM test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 4 |
+----+
4 rows in set (0.00 sec)
-- 删除id为4的记录,语句如下:
DELETE FROM test1 WHERE id = 4;
-- 再次插入一个空值,语句如下:
INSERT INTO test1 VALUES(0);
-- 查询此时数据表test1中的数据,结果如下:
mysql> SELECT * FROM test1;
+----+
| id |
+----+
| 1 |
| 2 |
| 3 |
| 5 |
+----+
4 rows in set (0.00 sec)
-- 从结果可以看出,虽然删除了id为4的记录,但是再次插入空值时,并没有重用被删除的4,而是分配了5。
-- 删除id为5的记录
DELETE FROM test1 where id=5;

重启数据库

service mysql stop
service mysql start

继续插入空值,然后再次查询数据表test1中的数据,结果如下:

mysql> INSERT INTO test1 values(0);
Query OK, 1 row affected (0.00 sec)
mysql> select * from test1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
+----+
4 rows in set (0.00 sec)

从结果可以看出,新插入的0值分配的是4,按照重启前的操作逻辑,此处应该分配6。出现上述结果的主要原因是自增主键没有持久化。 在MySQL 5.7系统中,对于自增主键的分配规则,是由InnoDB数据字典内部一个 计数器 来决定的,而该计数器只在 内存中维护 ,并不会持久化到磁盘中。当数据库重启时,该计数器会被初始化。

MySQL 8.0测试

上述测试步骤最后一步的结果如下:

mysql> select * from test1;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  6 |
+----+
4 rows in set (0.00 sec)

从结果可以看出,自增变量已经持久化了。

MySQL 8.0将自增主键的计数器持久化到 重做日志中。每次计数器发生改变,都会将其写入重做日志中。如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。

到此这篇关于MySQL 8.0自增变量的持久化的文章就介绍到这了,更多相关mysql自增变量内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 理解MySQL存储过程和函数

    理解MySQL存储过程和函数

    这篇文章主要帮助大家学习理解MySQL存储过程和函数,感兴趣的小伙伴们可以参考一下
    2016-03-03
  • 一文带你学会Mysql表批量添加字段

    一文带你学会Mysql表批量添加字段

    本文主要介绍了MySQL表如何批量添加字段的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • 深度解析MySQL 锁机制:间隙锁、Next-Key Lock 与幻读防御

    深度解析MySQL 锁机制:间隙锁、Next-Key Lock 与幻读防御

    本文深入探讨了MySQL的锁机制,特别是间隙锁(GapLock)和临键锁(Next-KeyLock),本文将从"为什么要锁间隙"出发,一路追到"为什么是左开右闭",把这套机制彻底讲透,感兴趣的朋友跟随小编一起看看吧
    2026-03-03
  • 宝塔安装的MySQL无法连接的情况及解决方案

    宝塔安装的MySQL无法连接的情况及解决方案

    宝塔面板是一款流行的服务器管理工具,其中集成的 MySQL 数据库有时会出现连接问题,本文详细介绍两种最常见的 MySQL 连接错误:“1130 - Host is not allowed to connect” 和 “1045 - Access denied”,以及它们的解决方案,需要的朋友可以参考下
    2025-05-05
  • mysql select缓存机制使用详解

    mysql select缓存机制使用详解

    这篇文章主要介绍了mysql select缓存机制使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • mysql请求阻塞问题解析

    mysql请求阻塞问题解析

    这篇文章主要介绍了mysql请求阻塞问题解析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2023-10-10
  • Mysql日志文件和日志类型介绍

    Mysql日志文件和日志类型介绍

    这篇文章主要介绍了Mysql日志文件和日志类型介绍,本文讲解了日志文件类型、错误日志、通用查询日志、慢速查询日志、二进制日志等内容,需要的朋友可以参考下
    2014-12-12
  • MySQL约束条件及设置方式

    MySQL约束条件及设置方式

    文章主要介绍了数据库中约束条件的设置,包括主键约束、自增约束、非空约束、唯一性约束、无符合约束、默认约束和外键约束,以及如何在数据库中设置这些约束条件
    2025-01-01
  • mysql limit分页优化详细介绍

    mysql limit分页优化详细介绍

    MySQL最常用也最需要优化的就是limit,MySQL的limit给分页带来了极大的方便,但数据量一大的时候,limit的性能就急剧下降,需要的朋友可以参考下
    2016-12-12
  • Centos6.4编译安装mysql 8.0.0 详细教程

    Centos6.4编译安装mysql 8.0.0 详细教程

    这篇文章主要为大家分享了Centos6.4编译安装mysql 8.0.0 详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-11-11

最新评论