当前位置: 代码网 > it编程>数据库>Mysql > MySQL 8.0自增变量的持久化问题小结

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

2024年11月14日 Mysql 我要评论
mysql 8.0特性-自增变量的持久化在mysql 8.0之前,自增主键auto_increment的值如果大于max(primary key)+1,在mysql重启后,会重置auto_increm

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自增变量内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com