小编典典

如何找到哪个事务导致“等待表元数据锁定”状态?

mysql

我试图在表上执行一些DDL,并SHOW PROCESSLIST导致出现“正在等待表元数据锁定”消息。

我如何找出尚未关闭的交易?

我正在使用MySQL v5.5.24。


阅读 328

收藏
2020-05-17

共1个答案

小编典典

SHOW ENGINE INNODB STATUS \G

寻找部分-

TRANSACTIONS

我们可以使用 INFORMATION_SCHEMA 表。

有用的查询

要检查所有锁事务正在等待:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

阻止交易的列表:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

要么

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

特定表上的锁列表:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

等待锁的事务列表:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

参考 -
MySQL的故障排除:怎么办时,查询不工作,第6章-第96页。

2020-05-17