无论如何显示所有在MySQL数据库中活动的锁?
查看InnoDB表的Marko链接和注意事项。
对于MyISAM来说,这不是一件容易的事情,“这是违规的查询”解决scheme。 你应该总是从一个stream程列表开始。 但一定要包含完整的关键字,以便打印的查询不被截断:
SHOW FULL PROCESSLIST;
这将向您显示所有当前进程,其SQL查询和状态的列表。 现在通常如果一个查询导致许多其他人locking,那么应该很容易识别。 受影响的查询将具有“ Locked
状态,并且有问题的查询将独立出来,可能正在等待一些密集的内容,如临时表。
如果不明显,那么你将不得不使用你的SQL演绎的能力来确定哪一个有问题的SQL可能是你的悲哀的原因。
如果您使用InnoDB,并且需要检查正在运行的查询,我推荐
show engine innodb status;
正如Marko的链接中提到的那样。 这将给你locking查询,有多less行/表被locking等。看看下TRANSACTIONS。
使用SHOW PROCESSLIST
的问题是,除非其他查询排队,否则不会看到锁。
使用这个命令
SHOW PROCESSLIST
将显示当前正在运行的所有进程,包括已经获取对表的locking的进程。
AFAIK在MYSQL中仍然没有本地的方式,但我使用innotop 。 它是免费的,还有很多其他的function。
另请参阅此链接以获取有关使用innotop工具的更多信息。
show open tables where In_Use > 0 ;
引用从这个职位。
你可以使用下面的脚本:
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