我正在尝试在表上执行某些DDL,而SHOW PROCESSLIST
会导致“等待表格元数据锁定”消息。
如何找出尚未关闭的交易?
我正在使用MySQL v5.5.24。
答案 0 :(得分:128)
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);
OR
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 Troubleshooting: What To Do When Queries Don't Work,第6章 - 第96页。
答案 1 :(得分:41)
如果你找不到锁定表的进程(因为它已经死了),它可能是一个仍然像这样清理的线程
的交易部分
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
在评论中提及 Clear transaction deadlock?
你可以尝试直接杀死事务线程,
KILL 5208136;
为我工作。
答案 2 :(得分:8)
mysql 5.7通过performance_schema.metadata_locks
表公开元数据锁信息。
文档here
答案 3 :(得分:1)
我在Datagrip遇到了类似的问题,但这些解决方案都没有奏效。
重新启动Datagrip客户端后,它不再是一个问题,我可以再次删除表。
答案 4 :(得分:0)
我刚刚遇到了这个问题,上面的查询都没有显示任何锁定。 但是我用这个“等待表元数据锁定”消息锁定了一个更改。 我发现有一个长时间运行的查询(它运行了两个多小时)。我终止了该查询,并且更改立即解锁。
答案 5 :(得分:0)
对于 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. |
+---------+------+-----------------------------------------------------------------------------------------------+