Från MySQL 5.7 och framåt är detta möjligt, men du måste först aktivera mdl
instrument i performance_schema.setup_instruments
tabell. Du kan göra detta tillfälligt (tills servern startas om nästa gång) genom att köra:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Eller permanent genom att lägga till följande besvärjelse till [mysqld]
avsnittet i din my.cnf
fil (eller vilka konfigurationsfiler som MySQL läser från på din installation):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Naturligtvis måste MySQL startas om för att konfigurationsändringen ska träda i kraft om du använder det senare tillvägagångssättet.)
Lås du tar ut efter mdl
instrumentet har aktiverats kan ses genom att köra en SELECT
mot performance_schema.metadata_locks
tabell. Som noterats i dokumenten, GET_LOCK
lås har en OBJECT_TYPE
av 'USER LEVEL LOCK'
, så att vi kan filtrera ner vår fråga till dem med en WHERE
klausul:
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>
Innebörden av kolumnerna i detta resultat är för det mesta tillräckligt dokumenterade på https://dev.mysql.com/doc/refman/en/metadata-locks-table.html
, men en punkt av förvirring är värd att notera:OWNER_THREAD_ID
kolumnen inte innehålla anslutningen ID (som skulle visas i PROCESSLIST
eller returneras av CONNECTION_ID()
) av tråden som håller låset. Förvirrande nog används termen "tråd-ID" ibland som en synonym till "anslutnings-ID" i MySQL-dokumentationen, men det är inte en av de gångerna. Om du vill bestämma anslutningen ID för anslutningen som har ett lås (till exempel för att döda den anslutningen med KILL
), måste du leta upp PROCESSLIST_ID
som motsvarar THREAD_ID
i performance_schema.threads
tabell. Till exempel för att döda anslutningen som höll mitt lås ovanför...
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)