如何找到导致"等待表元数据锁定"状态的事务?

Dre*_*rew 87 mysql

我试图在表上执行一些DDL并SHOW PROCESSLIST导致"等待表元数据锁定"消息.

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

我正在使用MySQL v5.5.24.

Jod*_*ddy 132

SHOW ENGINE INNODB STATUS \G
Run Code Online (Sandbox Code Playgroud)

寻找科 -

TRANSACTIONS
Run Code Online (Sandbox Code Playgroud)

我们可以使用INFORMATION_SCHEMA表.

有用的查询

检查所有锁定事务正在等待:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;
Run Code Online (Sandbox Code Playgroud)

阻止交易列表:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);
Run Code Online (Sandbox Code Playgroud)

要么

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);
Run Code Online (Sandbox Code Playgroud)

特定表上的锁列表:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;
Run Code Online (Sandbox Code Playgroud)

等待锁的事务列表:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';
Run Code Online (Sandbox Code Playgroud)

参考 - MySQL故障排除:当查询不起作用时该怎么做,第6章 - 第96页.

  • 请注意,引用的所有表都在`INFORMATION_SCHEMA`数据库中. (16认同)
  • 所有这些都有空集...但是仍有锁在进程列表中显示... (10认同)
  • 为什么这个答案有这么多点赞?它没有回答问题。提到的查询均未显示**元数据**锁... (9认同)
  • 这些InnoDB表真的包含有关元数据锁的信息吗?这篇博客文章另有说明:http://mysql.wisborg.dk/2014/01/13/who-holds-the-metadata-lock-mysql-5-7-3-brings-help/ (8认同)
  • 这些命令都不显示表元数据锁. (3认同)

thi*_*rer 46

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

交易部分

show engine innodb status;
Run Code Online (Sandbox Code Playgroud)

在末尾

---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
Run Code Online (Sandbox Code Playgroud)

Clear事务死锁的评论中提到的

你可以尝试直接杀死事务线程,这里有

 KILL 5208136;
Run Code Online (Sandbox Code Playgroud)

为我工作.


yak*_*out 13

对于 MySQL 版本 >=,5.7.3性能模式现在公开元数据锁定信息。 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();
Run Code Online (Sandbox Code Playgroud)

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

Empty set, 1 warning (0.001 sec)
Run Code Online (Sandbox Code Playgroud)

检查 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. |
+---------+------+-----------------------------------------------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)


Hln*_*Hln 9

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

文档在这里


son*_*207 7

我在 Datagrip 上遇到了类似的问题,但这些解决方案都没有奏效。

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

  • 重新启动/重新启动 - 任何计算机问题的 100% 工作解决方案。然而,在 Prod 中,重启并不总是可能的 (3认同)
  • 我遇到了同样的问题,关闭 DataGrip 突然失去了所有的锁。那真是浪费了很多时间.. (2认同)