117

我正在尝试对表执行一些 DDL 并SHOW PROCESSLIST导致“等待表元数据锁定”消息。

我怎样才能知道哪个交易还没有结束?

我正在使用 MySQL v5.5.24。

4

6 回答 6

170

适用于 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 故障排除:查询不起作用时该怎么办,第 6 章 - 第 96 页。

于 2012-10-31T10:24:09.333 回答
64

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

交易部分

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;

为我工作。

于 2014-05-20T10:26:46.857 回答
19

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

文档在这里

于 2016-03-23T10:40:43.723 回答
8

我对 Datagrip 也有类似的问题,但这些解决方案都没有奏效。

重新启动 Datagrip 客户端后,它不再是问题,我可以再次删除表。

于 2017-12-23T04:29:57.917 回答
6

对于 MySQL 版本 >= 5.7.3,Performance Schema 现在公开元数据锁定信息。 https://dev.mysql.com/doc/relnotes/mysql/5.7/en/news-5-7-3.html

运行此查询以了解谁持有您的元数据锁

SELECT OBJECT_TYPE,
       OBJECT_SCHEMA,
       OBJECT_NAME,
       LOCK_TYPE,
       LOCK_STATUS,
       THREAD_ID,
       PROCESSLIST_ID,
       PROCESSLIST_INFO
FROM performance_schema.metadata_locks
INNER JOIN performance_schema.threads ON THREAD_ID = OWNER_THREAD_ID
WHERE PROCESSLIST_ID <> CONNECTION_ID();

当我尝试在接受的答案中运行查询时,我收到了以下信息:

Empty set, 1 warning (0.001 sec)

检查 1 个警告,我发现它INNODB_LOCK_WAITS已被弃用。

MySQL [ebdb]> SHOW WARNINGS;
+---------+------+-----------------------------------------------------------------------------------------------+
| Level   | Code | Message                                                                                       |
+---------+------+-----------------------------------------------------------------------------------------------+
| Warning | 1681 | 'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' is deprecated and will be removed in a future release. |
+---------+------+-----------------------------------------------------------------------------------------------+
于 2021-06-07T14:41:38.773 回答
1

我刚遇到这个问题,上面的查询都没有显示任何锁定。但是我用这个“等待表元数据锁定”消息锁定了一个变更。我发现有一个长时间运行的查询(它运行了两个多小时)。我杀死了那个查询并且改变立即解锁。

于 2021-04-19T18:15:46.320 回答