主要观点总结
文章介绍了Percona资深工程师Marco Tusa爆料关于MySQL 8.0.38版本及之后版本的问题,即在实例中表个数超过一万时,实例重启会出现Crash失败的情况。文章还提到了相应的测试用例和测试结果,以及应对方案和个人看法。
关键观点总结
关键观点1: MySQL 8.0.38及以上版本存在表数量超过一万后实例重启失败的问题。
该问题在Percona工程师Marco Tusa的爆料中得到确认,详细复现过程参见其提供的链接。该问题在MySQL 8.4.1和9.0.0版本中同样存在。
关键观点2: 测试用例及结果
文章提供了一个简单的测试用例来复现这个问题,包括创建一个数据库、创建表、插入数据、达到表数量上限并重启实例的步骤。测试结果显示,在升级到指定版本后,实例重启会失败。
关键观点3: 问题规避方案和个人看法
文章提到了采用共享/通用表空间方案来规避这个问题,并提供了相应的SQL命令。个人看法中,虽然这个问题很low,但很容易规避。作者对MySQL依然持有乐观态度,并分享了一些其他相关话题。
关键观点4: AliSQL内核开发者对问题的深入分析
文章提到了AliSQL内核开发者对引发此问题的bug进行的深入分析,以及他在AliSQL上做的优化。同时提供了相关链接供读者深入了解。
正文
-- 创建一个最简单的表,并写入数据
> CREATE DATABASE test;
> USE test;
> CREATE TABLE t_1 (
`id` int NOT NULL,
PRIMARY KEY (`id`)
);
> INSERT INTO t_1 SELECT 1;
然后反复创建类似上面的表,表个数达到 1 万。
> SELECT COUNT(*) FROM information_schema.tables WHERE TABLE_SCHEMA ='test';
+----------+
| count(*) |
+----------+
| 10000 |
+----------+
之后重启实例,就能看到日志里有类似下面的内容,启动失败:
[Note] [MY-012207] [InnoDB] Using 2 threads to scan 10002 tablespace files
[Note] [MY-012200] [InnoDB] Thread# 0 - Checked 876/10002 files
...
[Note] [MY-012201] [InnoDB] Checked 10002 files
[Note] [MY-012208] [InnoDB] Completed space ID check of 10004 files.
...
2024-07-12T06:48:14Z UTC - mysqld got signal 11 ;
Signal SIGSEGV (Address not mapped to object) at address 0x508
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
BuildID[sha1]=7f06a4743d7801096bd81bc999201fdbca43a12c
Thread pointer: 0x0
Attempting backtrace. You can use the following information to find out
where mysqld died. If you see no messages after this, something went
terribly wrong...
stack_bottom = 0 thread_stack 0x100000
[root@db160 mysql-9.0.0-linux-glibc2.17-x86_64-minimal]# #0 0x103f726