我正在尝试对表执行一些 DDL,并且 SHOW PROCESSLIST
导致“等待表元数据锁定”消息。
我怎样才能知道哪个交易还没有结束?
我正在使用 MySQL v5.5.24。
最佳答案
适用于 MySql 版本 < 5.7.3
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 Troubleshooting: What To Do When Queries Don't Work ,第 6 章 - 第 96 页。
关于mysql - 如何找到导致 "Waiting for table metadata lock"状态的事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13148630/