我如何显示 mysql 锁?

我如何显示 mysql 锁?

有没有什么方法可以显示 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

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

相关内容