MySQL 中“等待表元数据锁定”状态的故障排除
对表执行 DDL 操作有时会导致“等待表”检查 SHOW PROCESSLIST 时出现“元数据锁定”消息。这表明另一个事务尚未关闭并持有表上的锁,从而阻止修改。
识别阻塞事务
确定哪个事务导致这种状态下,可以采用以下方法:
1. SHOW ENGINE INNODB STATUS
(对于 MySQL 版本
执行 SHOW ENGINE INNODB STATUS G 显示有关 InnoDB 内部的详细信息,包括 TRANSACTIONS 部分。这将列出活跃交易及其状态。
2. INFORMATION_SCHEMA 表
INFORMATION_SCHEMA 中的 INNODB_LOCK_WAITS 表包含有关等待锁的事务的信息。要检查所有此类事务,请使用:
<code class="sql">SELECT * FROM INNODB_LOCK_WAITS;</code>
要识别阻塞事务,请执行:
<code class="sql">SELECT * FROM INNODB_LOCKS WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);</code>
或者:
<code class="sql">SELECT INNODB_LOCKS.* FROM INNODB_LOCKS JOIN INNODB_LOCK_WAITS ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);</code>
要检查特定上的锁定表:
<code class="sql">SELECT * FROM INNODB_LOCKS WHERE LOCK_TABLE = db_name.table_name;</code>
列出等待锁的事务:
<code class="sql">SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY FROM INNODB_TRX WHERE TRX_STATE = 'LOCK WAIT';</code>
其他资源
请参阅 MySQL 故障排除指南,第 6 章,第 96 页,进一步了解如何解决此问题。
以上是如何识别并解决MySQL“等待表元数据锁”?的详细内容。更多信息请关注PHP中文网其他相关文章!