首页  >  文章  >  数据库  >  如何识别并解决MySQL“等待表元数据锁”?

如何识别并解决MySQL“等待表元数据锁”?

Patricia Arquette
Patricia Arquette原创
2024-10-31 12:54:30707浏览

How to Identify and Resolve

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn