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


94

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

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

我正在使用MySQL v5.5.24。

Answers:


145
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页。


17
请注意,所有引用的表都在INFORMATION_SCHEMA数据库中。
Michael Mior 2013年

9
这些InnoDB表是否真的保存有关元数据锁的信息?该博客文章另有建议:mysql.wisborg.dk/2014/01/13/…–
Gareth

1
@Gareth:直到mysql -mysql-5-7-3-都可以使用。感谢您的更新。
乔迪,2015年

11
所有这些都有空集...但是
进程列表


50

如果找不到锁定表的进程(因为它已经死了),则可能是这样的线程仍在清理中

交易部分

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;

为我工作。


10

mysql 5.7通过该performance_schema.metadata_locks表公开元数据锁定信息 。

这里的文件


4

我在Datagrip中遇到了类似的问题,但这些解决方案均无法正常工作。

重新启动Datagrip Client之后,它不再是问题,可以再次删除表。


3
重新启动/重新启动-任何计算机问题的100%有效解决方案。但是,在Prod中,重启并不总是可能的

1
我遇到了同样的问题,关闭DataGrip突然删除了所有锁。这是一堆浪费时间..
ScottBurfieldMills
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.