你知道MySQL innodb自增ID BUG有多大影响吗?

文 / @WordPress主题

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相关知识和技能,也是非常重要的。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。