有没有办法选择/显示使用GET_LOCK
function取出的所有当前锁?
请注意GET_LOCK
锁不同于表锁,例如那些使用LOCK TABLES
获取的锁 - 想要知道如何查看那些锁的读者应阅读{{3} }
答案 0 :(得分:17)
从MySQL 5.7开始,性能模式公开所有元数据锁,包括与GET_LOCK()
函数相关的锁。
请参阅http://dev.mysql.com/doc/refman/5.7/en/metadata-locks-table.html
答案 1 :(得分:14)
SHOW FULL PROCESSLIST;
你会在那里看到锁
答案 2 :(得分:12)
从MySQL 5.7开始,这是可能的,但需要先在performance_schema.setup_instruments
表中启用mdl
工具。您可以通过运行:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
或永久地,通过将以下咒语添加到[mysqld]
文件的my.cnf
部分(或MySQL在您的安装中读取的任何配置文件):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(当然,如果采用后一种方法,需要重新启动MySQL才能使配置更改生效。)
启用mdl
工具后,您可以通过对performance_schema.metadata_locks
表运行SELECT
来查看锁定。如文档中所述,GET_LOCK
锁具有OBJECT_TYPE
'USER LEVEL LOCK'
,因此我们可以使用WHERE
子句过滤我们的查询:
mysql> SELECT GET_LOCK('foobarbaz', -1);
+---------------------------+
| GET_LOCK('foobarbaz', -1) |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
mysql> SELECT * FROM performance_schema.metadata_locks
-> WHERE OBJECT_TYPE='USER LEVEL LOCK'
-> \G
*************************** 1. row ***************************
OBJECT_TYPE: USER LEVEL LOCK
OBJECT_SCHEMA: NULL
OBJECT_NAME: foobarbaz
OBJECT_INSTANCE_BEGIN: 139872119610944
LOCK_TYPE: EXCLUSIVE
LOCK_DURATION: EXPLICIT
LOCK_STATUS: GRANTED
SOURCE: item_func.cc:5482
OWNER_THREAD_ID: 35
OWNER_EVENT_ID: 3
1 row in set (0.00 sec)
mysql>
此结果中列的含义大部分都在https://dev.mysql.com/doc/refman/en/metadata-locks-table.html充分记录,但有一点值得注意:OWNER_THREAD_ID
列不包含<持有锁的线程的em> connection ID(如PROCESSLIST
中所示或由CONNECTION_ID()
返回))。令人困惑的是,术语“线程ID”有时被用作MySQL文档中“连接ID”的同义词,但这不其中一个时间。如果要确定持有锁的连接的连接 ID(例如,为了使用KILL
终止该连接),则需要查找{{ 1}}对应performance_schema.threads
表中的PROCESSLIST_ID
。例如,要杀死上面锁定我的锁的连接......
THREAD_ID
答案 3 :(得分:5)
如果您只想确定当前是否保留了特定的命名锁,您可以使用IS_USED_LOCK
:
SELECT IS_USED_LOCK('foobar');
如果某个连接持有锁,则将返回该连接的ID;否则,结果为NULL
。
答案 4 :(得分:1)
如果您知道锁定名称
,我找到了以下方法select IS_USED_LOCK('lockname');
但是我没有找到任何关于如何列出所有名字的信息。
答案 5 :(得分:0)
另一种简单的方法是使用:
mysqladmin debug
这会将大量信息(包括锁)转储到错误日志中。
答案 6 :(得分:0)
<强> Reference taken from this post: 强>
您也可以使用此脚本在MySQL中查找锁定。
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