MySQL 5.7以降では、これは可能ですが、最初にmdl
を有効にする必要があります performance_schema.setup_instruments
のインストゥルメント
テーブル。これは、次のコマンドを実行して一時的に(サーバーが次に再起動されるまで)実行できます。
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
機器が有効になっていることは、SELECT
を実行することで確認できます performance_schema.metadata_locks
に対して
テーブル。ドキュメントに記載されているように、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
、ただし、1つの混乱点は注目に値します:OWNER_THREAD_ID
列はしません 接続を含む ID(PROCESSLIST
に表示されるようなもの またはCONNECTION_ID()
によって返されます )ロックを保持するスレッドの。紛らわしいことに、「スレッドID」という用語は、MySQLドキュメントで「接続ID」の同義語として使用されることがありますが、これはではありません。 それらの時間の1つ。 接続を確認する場合 ロックを保持している接続のID(たとえば、 KILL
)、PROCESSLIST_ID
を検索する必要があります THREAD_ID
に対応します performance_schema.threads
テーブル。たとえば、上のロックを保持していた接続を切断するには...
mysql> SELECT OWNER_THREAD_ID FROM performance_schema.metadata_locks
-> WHERE OBJECT_TYPE='USER LEVEL LOCK'
-> AND OBJECT_NAME='foobarbaz';
+-----------------+
| OWNER_THREAD_ID |
+-----------------+
| 35 |
+-----------------+
1 row in set (0.00 sec)
mysql> SELECT PROCESSLIST_ID FROM performance_schema.threads
-> WHERE THREAD_ID=35;
+----------------+
| PROCESSLIST_ID |
+----------------+
| 10 |
+----------------+
1 row in set (0.00 sec)
mysql> KILL 10;
Query OK, 0 rows affected (0.00 sec)