慢日志无法定位MDL阻塞,因其只记录超时完成语句,而MDL阻塞线程处于Waiting状态、无SQL执行、TRX_QUERY为空;必须用performance_schema.metadata_locks联合INNODB_TRX和PROCESSLIST三表诊断。

慢日志本身不记录MDL阻塞,直接查它找不到持锁线程——必须配合performance_schema.metadata_locks和INNODB_TRX联合定位。
为什么慢日志对MDL阻塞基本无效
MDL阻塞的典型表现是线程卡在Waiting for table metadata lock状态,但这个等待过程不执行SQL、不扫描数据、不产生I/O,所以不会被慢日志捕获。慢日志只记录执行时间超long_query_time的完成语句,而阻塞者往往只是Sleep着挂了个事务,TRX_QUERY为空,PROCESSLIST_INFO也为空。
- 慢日志里看不到
ALTER TABLE卡住的原因,只能看到它“没执行完”,但不知道谁在挡路 - 真正持锁的线程可能只执行过一条
SELECT就断开连接,autocommit=0下事务一直开着,这种操作通常远低于慢查询阈值 - MySQL 8.0+默认
long_query_time = 10,而很多悬挂事务已存在几小时,却因无实际语句执行,完全不出现在慢日志中
慢日志唯一可用的间接线索
如果你确实打开了慢日志且配置了log_slow_admin_statements = ON(MySQL 5.7+),那ALTER TABLE等DDL语句才可能被记录——但这只告诉你“哪个DDL慢了”,仍不揭示阻塞源。
- 查慢日志中最近的
ALTER或DROP语句,确认其开始时间,再回溯同一时刻的活跃事务:SELECT * FROM information_schema.INNODB_TRX WHERE trx_started < '2026-09-02 22:15:00' - 若慢日志里出现大量重复的
SELECT ... FOR UPDATE或隐式事务开头的语句(如BEGIN后无后续),要警惕应用层连接未关闭 - 注意:即使
log_slow_admin_statements = ON,TRUNCATE TABLE也不会进慢日志,它不算“admin statement”
正确路径:用performance_schema替代慢日志查MDL
别在慢日志里翻来覆去,立刻切到performance_schema三表联查。这是MySQL 5.7+诊断MDL阻塞的唯一可靠路径。
- 先确保采集器开启:
UPDATE performance_schema.setup_instruments SET ENABLED = 'YES' WHERE NAME = 'wait/lock/metadata/sql/mdl'; - 查谁在持锁:
SELECT OBJECT_SCHEMA, OBJECT_NAME, LOCK_TYPE, LOCK_DURATION, PROCESSLIST_ID FROM performance_schema.metadata_locks m JOIN performance_schema.threads t ON m.OWNER_THREAD_ID = t.THREAD_ID WHERE LOCK_STATUS = 'GRANTED' AND LOCK_DURATION = 'TRANSACTION'; - 关联事务详情:
SELECT t.trx_id, t.trx_started, t.trx_state, t.trx_query, p.PROCESSLIST_USER, p.PROCESSLIST_HOST FROM information_schema.INNODB_TRX t JOIN information_schema.PROCESSLIST p ON t.trx_mysql_thread_id = p.ID WHERE t.trx_mysql_thread_id IN (123, 456);(填上上一步的PROCESSLIST_ID)
容易忽略的关键点
很多人查到PROCESSLIST_ID就急着KILL,但忘了验证该线程是否真在影响业务——比如它可能是报表导出任务,刚跑完大查询正准备提交。
-
TRX_ROWS_MODIFIED = 0≠ 安全可杀;它可能刚执行完UPDATE正卡在应用层逻辑里 -
PROCESSLIST_INFO为空也不代表没风险;要结合trx_isolation_level和trx_autocommit判断事务性质 - MySQL 8.0+优先用
sys.schema_table_lock_waits,它把blocking_pid和sql_kill_blocking_connection都打包好了,比手拼三表快得多


















