这个星球真有人在一个数据库里放10000张表

原创
2024/07/24 18:36
阅读数 0

前些日子有个万年一遇的重大缺陷在社区里引发讨论,这直接导致 Oracle 例外发布了 MySQL 新版本,并下架了有缺陷的版本。

7月23日,MySQL 8.0.39 / 8.4.2 LTS / 9.0.2 Innovation 版本发布,该版本修复了3个Bug。

  1. InnoDB:在某些情况下,创建大量表(8001 个或更多)后,服务器无法成功重新启动。(Bug #36808732)
  2. InnoDB:改进了启动时的表空间文件扫描性能。(Bug #110402、Bug #35200385)
  3. 组复制:在来自异步通道到组复制的源上运行 CREATE TABLE ... SELECT 语句会导致副本出现错误。(错误 #36784284)

受影响的三个版本 MySQL 8.0.38 / 8.4.1 / 9.0.0 已下架,不再提供安装包下载。

并在对应版本的发版说明中增加了如下提示:

此版本不再可供下载。由于存在严重问题,该问题可能导致服务器在创建大量表(8001 个或更多)后无法重新启动,因此已将其删除。请升级到 MySQL 8.0.39。

下面使用 MySQL 8.4.2 演示第一个Bug,验证新版本。

启动 MySQL 8.4.2 容器镜像。

podman run --name mysql-8.4.2 -p 3842:3306 \
-e MYSQL_ROOT_HOST='%' -e MYSQL_ROOT_PASSWORD='1' \
-d mysql:8.4.2 --log-error-verbosity=3

执行测试脚本,生成10000张表。

[shawnyan@ol9 ~]$ ./gen_10000_tables.sh
Checking MySQL connection...
Creating database if it doesn't exist...
Completed creating 10000 tables out of 10000.

确认表的数量。

(root@127.0.0.1) [(none)] 10:18:05> SELECT COUNT(*)
    -> FROM information_schema.tables
    -> WHERE table_schema = 'test';
+----------+
| COUNT(*) |
+----------+
|    10000 |
+----------+
1 row in set (0.02 sec)

重启容器,并查看日志。

podman stop mysql-8.4.2
podman start mysql-8.4.2
podman logs mysql-8.4.2

可以看到,该版本在创建10000张表之后,可以正常重启动。

2024-07-24T01:48:31.065241Z 0 [System] [MY-015015] [Server] MySQL Server - start.
2024-07-24T01:48:31.357450Z 0 [Note] [MY-013932] [Server] BuildID[sha1]=a6fd834122e5831891bf73c08fa3b15d60cc914a
2024-07-24T01:48:31.357473Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.4.2) starting as process 1
2024-07-24T01:48:31.366601Z 1 [System] [MY-013576] [InnoDB] InnoDB initialization has started.
2024-07-24T01:48:31.431698Z 1 [Note] [MY-012207] [InnoDB] Using 2 threads to scan 10002 tablespace files
2024-07-24T01:48:33.498219Z 1 [Note] [MY-012208] [InnoDB] Completed space ID check of 10004 files.
2024-07-24T01:48:34.445816Z 1 [Note] [MY-012976] [InnoDB] 8.4.2 started; log sequence number 188559023
2024-07-24T01:48:34.446808Z 1 [System] [MY-013577] [InnoDB] InnoDB initialization has ended.
2024-07-24T01:48:34.470979Z 1 [Note] [MY-011089] [Server] Data dictionary restarting version '80300'.
2024-07-24T01:48:34.623204Z 1 [Note] [MY-012357] [InnoDB] Reading DD tablespace files
2024-07-24T01:48:35.405717Z 1 [Note] [MY-012356] [InnoDB] Scanned 10006 tablespaces. Validated 10006.
2024-07-24T01:48:35.427433Z 1 [Note] [MY-010006] [Server] Using data dictionary with version '80300'.
2024-07-24T01:48:35.678606Z 0 [System] [MY-011323] [Server] X Plugin ready for connections. Bind-address: '::' port: 33060, socket: /var/run/mysqld/mysqlx.sock
2024-07-24T01:48:35.678665Z 0 [System] [MY-010931] [Server] /usr/sbin/mysqld: ready for connections. Version: '8.4.2'  socket: '/var/run/mysqld/mysqld.sock'  port: 3306  MySQL Community Server - GPL.

那么,

你会在MySQL中创建这么多表么?又是什么业务场景呢?欢迎留言讨论。


🌻 往期精彩 ▼


-- / END / --

👉 这里可以找到我

  • 微信公众号: 少安事务所
  • 墨天轮: 严少安
  • PGFans: 严少安
  • ITPUB: 少安事务所
  • TiDB 专栏: @ShawnYan

如果这篇文章为你带来了灵感或启发,就请帮忙点『』or『在看』or『转发』吧,感谢!ღ( ´・ᴗ・` )~

本文分享自微信公众号 - 少安事务所(mysqloffice)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
0 收藏
0
分享
返回顶部
顶部