#1 楼
有关InnoDB表和警告的信息,请参见Marko的链接。对于MyISAM,没有一个简单的“这是令人讨厌的查询”解决方案。您应该始终从过程列表开始。但是请确保包含完整关键字,以免打印查询被截断:
SHOW FULL PROCESSLIST;
这将向您显示所有当前进程,其SQL查询和州。现在,通常如果单个查询导致许多其他查询锁定,则应该易于识别。受影响的查询的状态将为
Locked
,并且有问题的查询将自行退出,可能会等待一些密集的工作,例如临时表。如果不明显,则必须使用您的SQL推论的力量,以确定哪些问题可能是造成您麻烦的SQL。
#2 楼
如果您使用InnoDB,并且需要检查正在运行的查询,那么我建议show engine innodb status;
,如Marko的链接中所述。这将为您提供锁定查询,它锁定了多少行/表等。在TRANSACTIONS下查看。
使用
SHOW PROCESSLIST
的问题是,除非其他查询正在排队,否则您将看不到锁。 评论
这应该是公认的答案。它将有一个“最新检测的死锁”部分
–加布里埃尔·弗斯滕海姆(Gabriel Furstenheim)
20年5月11日在10:24
#3 楼
尝试SHOW OPEN TABLES
:show open tables where In_Use > 0 ;
评论
我认为这是立即识别使用中锁的最佳方法,尤其是当您有多个数据库和数百个连接时。
–nelaaro
18年4月12日在14:38
#4 楼
没有答案可以显示当前持有的所有锁。执行此操作,例如在终端中的mysql中。
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
显然,上面的事务具有锁定,因为该事务仍处于活动状态。但是现在没有查询在进行,也没有人在任何地方等待锁(至少)。
INFORMATION_SCHEMA.INNODB_LOCKS
为空,这对于文档来说是有意义的,因为只有一个事务,并且目前没有人等待任何锁。仍然不建议使用INNODB_LOCKS
。SHOW ENGINE INNODB STATUS
没用:根本没有提到someTable
SHOW FULL PROCESSLIST
是空的,因为罪魁祸首实际上并没有在运行查询。您可以使用
INFORMATION_SCHEMA.INNODB_TRX
,performance_schema.events_statements_history
和performance_schema.threads
提取查询中过去执行过的所有活动事务的查询,如我的其他答案所述,但是我没有遇到任何方式看到someTable
被锁定上面的情况。到目前为止,其他答案中的建议至少没有帮助。
免责声明:我没有安装innotop,也没有打扰。也许可以用。
评论
我只是打算专门针对这种情况写一个问题(启动事务,运行更新并等待),然后我注意到了您的答案。我在生产中遇到这个问题。我的想法是在遇到“超出锁定等待超时”错误时检测到“卡住”的代码锁定,然后同时执行两件事:重新运行查询,并运行SHOW ENGINE INNODB STATUS(从另一个线程或进程,在第二个连接上)。但我希望有一个更简单的方法...
–obe
20年1月21日在20:05
#5 楼
使用此命令SHOW PROCESSLIST
将显示当前正在运行的所有进程,包括已获得表锁定的进程。
#6 楼
AFAIK在MYSQL中仍然没有本地方法,但是我使用了innotop。它是免费的,还具有许多其他功能。有关使用innotop工具的更多信息,请参见此链接。
#7 楼
您可以使用以下脚本:
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
评论
您可以查询INNODB_LOCK_WAITS和INNODB_LOCKS表。