你知道MySQL innodb自增ID BUG有多大影响吗?
MySQL Innodb自增IDBUG对数据安全的影响
MySQL是目前广泛应用在互联网行业的关系型数据库管理系统,而Innodb是MySQL的默认存储引擎之一。在使用Innodb存储引擎的过程中,我们经常会使用自增ID来作为主键,来保证数据的唯一性和完整性。但是,有一个神奇的问题:在执行物理删除后,重启MySQL服务后再次插入数据时,自增ID会从已删除的ID开始递增,而不是从最大ID加1开始。这个问题在某些情况下,可能会引起数据安全问题,下面我们来具体分析一下。
首先,让我们来复现一下这个神奇的问题。我们创建一个测试表,有个自增ID,然后插入3条数据,删除id=3的那条。
```
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB CHARACTER SET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=Dynamic;
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
insert into test values ();
select LAST_INSERT_ID();
delete from test where id=3;
```
然后,我们重启一下MySQL服务,再插入一条记录,看一下最后插入ID。
```
insert into test values ();
select LAST_INSERT_ID();
select * from test;
```
结果就是,重启后,再插入记录,ID依然还是3!
原来,Innodb的自增ID,会在服务重启后,自动设置为记录中最大ID+1。这个问题,只要是做物理删除的系统里,100%可以复现。假设某个表的自增ID,还会和其它记录相关联。极端情况下,重启服务前删除了最大ID的记录,服务恢复后插入记录再去关联,数据混乱问题不敢想象!
好在,这个问题在MySQL8.0中已经得到了修复。对于MySQL5.7或更旧的版本用户,我们可以采取以下多种解决方案:
1. 系统中的物理删除,全部改为软删除。一般框架内置此功能,修改重构很方便。
2. 启用innodb_autoinc_persistent设置,性能有1%损耗,可以忽略不计。
```
innodb_autoinc_persistent=on
innodb_autoinc_persistent_interval=1
```
总之,在使用Innodb存储引擎的过程中,一定要注意自增ID的问题,尤其是在涉及到物理删除的业务场景中更是如此。同时,加强学习MySQL相关知识和技能,也是非常重要的。

-
MySQL Workbench怎么建立数据库(附:sql语句创建数据库方法) 2023-07-20 12:22:29
-
MySQL Workbench是什么?(附:如何设置中文教程) 2023-07-20 11:42:31
-
一起聊聊MySQL主从延时的处理方案 2023-05-14 07:00:03
-
mysql怎么将查询结果赋给变量 2023-05-14 07:00:03
-
mysql驱动是什么 2023-05-14 07:00:03
-
qt5.8如何连接mysql 2023-05-14 07:00:03
-
MySQL 语法整理介绍 2023-05-14 07:00:03
-
mysql修改表结构的语句是什么 2023-05-14 07:00:03
-
mysql乐观锁和悲观锁的区别是什么 2023-05-14 07:00:03
-
mysql查询怎么区分大小写 2023-05-14 07:00:02