显示get_lock的所有当前锁

时间:2012-06-14 13:46:34

标签: mysql locking

有没有办法选择/显示使用GET_LOCK function取出的所有当前锁?

请注意GET_LOCK锁不同于表锁,例如那些使用LOCK TABLES获取的锁 - 想要知道如何查看那些锁的读者应阅读{{3} }

7 个答案:

答案 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