元数据锁死锁诊断:从 performance_schema 追踪 DDL 与事务冲突
深入 MySQL 元数据锁(MDL)机制,通过 performance_schema.metadata_locks 表和 sys.schema_unused_indexes 视图,准确诊断 DDL 操作因长事务阻塞的根源。 · 难度:入门 · +10XP
元数据锁死锁诊断
大多数 MySQL 用户遇到 Waiting for table metadata lock 时不知所措。本教程展示如何开启 performance_schema 并查询当前 MDL 等待链:哪个线程持有锁、哪个线程在等待、持有线程正在执行什么语句。同时通过设置 lock_wait_timeout 和 pt-query-digest 分析长查询,避免 ALTER TABLE 被阻塞。
-- 查看当前MDL等待情况
SELECT * FROM performance_schema.metadata_locks
WHERE OBJECT_SCHEMA = 'mydb'
AND OBJECT_NAME = 'mytable'
AND LOCK_STATUS = 'WAITING';
-- 找到阻塞源头
SELECT THREAD_ID, PROCESSLIST_ID, PROCESSLIST_INFO
FROM performance_schema.threads
WHERE THREAD_ID IN (
SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
WHERE OBJECT_NAME='mytable' AND LOCK_STATUS='GRANTED'
);