Fra MySQL 5.7 og fremefter er dette muligt, men det kræver først at aktivere mdl
instrument i performance_schema.setup_instruments
bord. Du kan gøre dette midlertidigt (indtil serveren næste gang genstartes) ved at køre:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Eller permanent ved at tilføje følgende besværgelse til [mysqld]
sektion af din my.cnf
fil (eller hvilke konfigurationsfiler MySQL læser fra på din installation):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Naturligvis skal MySQL genstartes for at få konfigurationsændringen til at træde i kraft, hvis du tager den sidstnævnte tilgang.)
Låse du tager ud efter mdl
instrumentet er blevet aktiveret, kan ses ved at køre en SELECT
mod performance_schema.metadata_locks
bord. Som nævnt i dokumenterne, GET_LOCK
låse har en OBJECT_TYPE
af 'USER LEVEL LOCK'
, så vi kan filtrere vores forespørgsel ned til 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>
Betydningen af kolonnerne i dette resultat er for det meste tilstrækkeligt dokumenteret på https://dev.mysql.com/doc/refman/da/metadata-locks-table.html
, men et punkt til forveksling er værd at bemærke:OWNER_THREAD_ID
kolonne ikke indeholde forbindelsen ID (som ville blive vist i PROCESSLIST
eller returneret af CONNECTION_ID()
) af tråden, der holder låsen. Forvirrende nok bruges udtrykket "tråd-id" nogle gange som et synonym for "forbindelses-id" i MySQL-dokumentationen, men dette er ikke en af de gange. Hvis du vil bestemme forbindelsen ID for forbindelsen, der holder en lås (f.eks. for at dræbe denne forbindelse med KILL
), skal du slå PROCESSLIST_ID
op der svarer til THREAD_ID
i performance_schema.threads
bord. For eksempel for at dræbe forbindelsen, der holdt min lås over...
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)