Answers:
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页。
如果找不到锁定表的进程(因为它已经死了),则可能是这样的线程仍在清理中
交易部分
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;
为我工作。
我在Datagrip中遇到了类似的问题,但这些解决方案均无法正常工作。
重新启动Datagrip Client之后,它不再是问题,可以再次删除表。
INFORMATION_SCHEMA
数据库中。