当MySQL出现Waiting for table metadata lock状态时,表示当前线程在等待表的元数据锁(MDL)。MDL用于保护数据库对象(如表、视图、存储过程)的结构一致性,尤其在执行DDL操作(如ALTER TABLE)或长时间未提交事务时容易触发。
-- 查看所有进程状态(过滤目标表和'Waiting for table metadata lock'状态)
SHOW FULL PROCESSLIST;
- 定位阻塞源
通过以下命令检查活跃事务和进程:
-- 查看未提交事务(重点关注trx_state='RUNNING'的会话)
SELECT * FROM information_schema.INNODB_TRX;
-- 生成需KILL的阻塞会话列表(针对MyISAM表需结合实际情况)
SELECT CONCAT('KILL ', trx_mysql_thread_id, ';') AS kill_cmd
FROM information_schema.INNODB_TRX
WHERE trx_state = 'RUNNING' AND trx_operation_state = 'fetching rows';
- 终止阻塞会话
根据查询结果,终止未提交事务或长时间阻塞的会话:
KILL <阻塞会话ID>;