有没有什么方法可以显示 mysql 数据库中所有活动的锁?
答案1
请参阅 Marko 的 InnoDB 表和注意事项链接。
对于 MyISAM,没有一种非常简单的“这是有问题的查询”解决方案。您应该始终从进程列表开始。但一定要包含完整的关键字,以便打印的查询不会被截断:
SHOW FULL PROCESSLIST;
这将向您显示所有当前进程的列表、它们的 SQL 查询和状态。现在通常如果单个查询导致许多其他查询锁定,那么应该很容易识别。受影响的查询将具有状态,Locked
并且有问题的查询将独自处于闲置状态,可能等待某些密集的操作,例如临时表。
如果不明显的话,那么您将不得不使用 SQL 推理能力来确定哪条有问题的 SQL 可能是导致您陷入困境的原因。
答案2
如果你使用 InnoDB 并且需要检查正在运行的查询,我建议
show engine innodb status;
如 Marko 的链接中所述。这将为您提供锁定查询,包括它锁定了多少行/表等。查看 TRANSACTIONS。
使用的问题SHOW PROCESSLIST
在于,除非其他查询正在排队,否则您将看不到锁。
答案3
show open tables where In_Use > 0 ;
答案4
您可以使用以下脚本:
SELECT
pl.id
,pl.user
,pl.state
,it.trx_id
,it.trx_mysql_thread_id
,it.trx_query AS query
,it.trx_id AS blocking_trx_id
,it.trx_mysql_thread_id AS blocking_thread
,it.trx_query AS blocking_query
FROM information_schema.processlist AS pl
INNER JOIN information_schema.innodb_trx AS it
ON pl.id = it.trx_mysql_thread_id
INNER JOIN information_schema.innodb_lock_waits AS ilw
ON it.trx_id = ilw.requesting_trx_id
AND it.trx_id = ilw.blocking_trx_id