如何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信息。

文档在这里