如何显示mysql锁?

Ama*_*rus 73 mysql

无论如何要显示mysql数据库中所有活动的锁?

Dan*_*ley 54

有关 InnoDB 表和注意事项,请参阅 Marko 的链接。

对于 MyISAM,没有一个简单的“这是有问题的查询”的解决方案。您应该始终从进程列表开始。但一定要包含完整的关键字,以便打印的查询不会被截断:

SHOW FULL PROCESSLIST;
Run Code Online (Sandbox Code Playgroud)

这将显示所有当前进程的列表、它们的 SQL 查询和状态。现在通常如果单个查询导致许多其他查询锁定,那么它应该很容易识别。受影响的查询的状态为Locked,有问题的查询将自行退出,可能等待一些密集的东西,比如临时表。

如果它不明显,那么您将不得不使用 SQL 推论的能力来确定哪段有问题的 SQL 可能是您的困境的原因。


小智 38

如果您使用 InnoDB 并且需要检查正在运行的查询,我建议

show engine innodb status;

如 Marko 的链接中所述。这将为您提供锁定查询,它锁定了多少行/表等。在 TRANSACTIONS 下查看。

使用的问题SHOW PROCESSLIST是除非其他查询正在排队,否则您将看不到锁。


小智 34

尝试SHOW OPEN TABLES

show open tables where In_Use > 0 ;
Run Code Online (Sandbox Code Playgroud)


Pet*_*rch 21

没有一个答案可以显示当前持有的所有锁。

例如在终端中的 mysql 中执行此操作。

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
Run Code Online (Sandbox Code Playgroud)

显然上面的事务持有锁,因为事务仍然处于活动状态。但是现在没有任何查询在进行,也没有人在任何地方等待锁定(至少是这样)。

INFORMATION_SCHEMA.INNODB_LOCKS是空的,鉴于文档,这是有道理的,因为只有一个事务,目前没有人在等待任何锁定。此外INNODB_LOCKS无论如何弃用。

SHOW ENGINE INNODB STATUS没用:someTable根本没有提到

SHOW FULL PROCESSLIST 是空的,因为罪魁祸首现在实际上并没有运行查询。

您可以使用INFORMATION_SCHEMA.INNODB_TRX,performance_schema.events_statements_historyperformance_schema.threads提取任何活动事务在过去执行的查询,如我的其他答案中所述,但我没有遇到任何方式来查看someTable上述情况中的锁定。

到目前为止,其他答案中的建议至少无济于事。

免责声明:我没有安装 innotop,我也没有打扰。也许这可以奏效。


小智 8

参考来自这篇文章。

您可以使用以下脚本:

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

  • 在 MySQL 5.7 上:“警告(代码 1681):'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' 已弃用,并将在未来版本中删除。” (3认同)

Ari*_*e K 7

使用这个命令

SHOW PROCESSLIST
Run Code Online (Sandbox Code Playgroud)

将显示当前正在运行的所有进程,包括已获得表锁定的进程。


Mar*_*ter 7

AFAIK 在 MYSQL 中仍然没有本地方式,但我使用innotop。它是免费的,并且还有许多其他功能。

另请参阅此链接以获取有关使用 innotop 工具的更多信息。