如何find哪个事务导致“等待表元数据locking”状态?
我试图在表上执行一些DDL, SHOW PROCESSLIST
结果为“等待表元数据locking”消息。
我怎样才能找出哪些交易尚未结束?
我正在使用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页。
如果你找不到locking表的进程(因为它已经死了),它可能是一个线程仍然像这样清理
节的交易
show engine innodb status;
最后
---TRANSACTION 1135701157, ACTIVE 6768 sec MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up
正如在清除事务死锁的评论中提到的那样?
你可以尝试直接在这里查杀事务线程
KILL 5208136;
为我工作。
mysql 5.7通过performance_schema.metadata_locks
表公开了元数据locking信息。
文档在这里