我试图在表上执行一些DDL,并SHOW PROCESSLIST导致出现“正在等待表元数据锁定”消息。
SHOW PROCESSLIST
我如何找出尚未关闭的交易?
我正在使用MySQL v5.5.24。
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页。