Od MySQL 5.7 výše je to možné, ale vyžaduje nejprve povolení mdl
nástroj v performance_schema.setup_instruments
stůl. Můžete to udělat dočasně (do příštího restartu serveru) spuštěním:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Nebo trvale přidáním následujícího zaklínadla do [mysqld]
části vašeho my.cnf
soubor (nebo jakékoli konfigurační soubory, které MySQL čte ve vaší instalaci):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Pokud použijete druhý přístup, bude samozřejmě nutné restartovat MySQL, aby se změna konfigurace projevila.)
Zámky, které odstraníte po mdl
nástroj byl aktivován lze zobrazit spuštěním SELECT
proti performance_schema.metadata_locks
stůl. Jak je uvedeno v dokumentech, GET_LOCK
zámky mají OBJECT_TYPE
z 'USER LEVEL LOCK'
, takže můžeme náš dotaz filtrovat až na ně pomocí WHERE
klauzule:
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>
Významy sloupců v tomto výsledku jsou většinou adekvátně zdokumentovány na https://dev.mysql.com/doc/refman/en/metadata-locks-table.html
, ale jeden bod zmatení stojí za zmínku:OWNER_THREAD_ID
sloupec není obsahovat spojení ID (jako by bylo uvedeno v PROCESSLIST
nebo vráceno CONNECTION_ID()
) závitu, který drží zámek. Je matoucí, že termín „ID vlákna“ je někdy používán jako synonymum „ID připojení“ v dokumentaci MySQL, ale není jeden z těch časů. Pokud chcete určit spojení ID připojení, které drží zámek (například za účelem ukončení tohoto připojení pomocí KILL
), budete muset vyhledat PROCESSLIST_ID
který odpovídá THREAD_ID
v performance_schema.threads
stůl. Například zabít spojení, které drželo můj zámek nahoře...
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)