终止分区表变更操作时误删数据字典缓存导致MySQL崩溃分析
1. 问题简述
在 MySQL 中,当终止一个处于 committing alter table to storage engine 阶段的分区表操作时,InnoDB 会尝试进行回滚并清理数据字典缓存。不幸的是,过程中发生了误删表缓存对象的情况 —— InnoDB 错误地移除了另一张非目标表的缓存条目,导致引用计数不为 0,触发断言失败并导致 MySQL 崩溃。
2. 复现步骤
环境说明:
系统:CentOS 7
数据库:MySQL 8.0.32
2.1 建表准备
CREATE DATABASE TEST;
CREATE TABLE TEST.A ( X INT)
PARTITION BY RANGE (X) (
PARTITION P0 VALUES LESS THAN (10000),
PARTITION PMAX VALUES LESS THAN MAXVALUE
);
CREATE TABLE TEST.A_1 LIKE TEST.A;
SELECT COUNT(*) FROM TEST.A_1;
2.2 反复尝试终止 ALTER TABLE 操作
在一个 Shell 中持续执行终止 "committing alter table to storage engine" 状态(KILL相应SQL请求)的线程:
while true; do { mysql --login-path=mylogin -BNe 'SELECT CONCAT("KILL ",ID ,";") FROM INFORMATION_SCHEMA.PROCESSLIST WHERE STATE = "COMMITTING ALTER TABLE TO STORAGE ENGINE";' | mysql --login-path=mylogin -vvv ; } ; done
2.3 循环执行 ALTER 操作
在另一个 Shell 中循环执行添加与删除分区的操作:
while true; do { mysql --login-path=mylogin -BNe "ALTER TABLE test.a ADD PARTITION (PARTITION pmax VALUES LESS THAN MAXVALUE);" ; mysql --login-path=mylogin -BNe " ALTER TABLE test.a DROP PARTITION pmax;" ; }; done
3. 崩溃日志与原因分析
当 DROP PARTITION 操作在关键阶段被 KILL 时,崩溃发生:
2025-06-05T17:03:19.270698+08:00 2975 [ERROR] [MY-013183] [InnoDB] Assertion failure: dict0dict.cc:1885:table->get_ref_count() == 0 thread 140327459395328
InnoDB: We intentionally generate a memory trap.
InnoDB: Submit a detailed bug report to http://bugs.mysql.com.
InnoDB: If you get repeated assertion failures or crashes, even
InnoDB: immediately after the mysqld startup, there may be
InnoDB: corruption in the InnoDB tablespace. P
误删缓存致MySQL崩溃问题分析

最低0.47元/天 解锁文章
174万+

被折叠的 条评论
为什么被折叠?



