Vanaf MySQL 5.7 is dit mogelijk, maar hiervoor moet eerst de mdl
worden ingeschakeld instrument in de performance_schema.setup_instruments
tafel. U kunt dit tijdelijk doen (tot de volgende keer dat de server opnieuw wordt opgestart) door het volgende uit te voeren:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Of permanent, door de volgende bezwering toe te voegen aan de [mysqld]
gedeelte van uw my.cnf
bestand (of welke configuratiebestanden MySQL dan ook leest op uw installatie):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Natuurlijk moet MySQL opnieuw worden gestart om de configuratiewijziging door te voeren als u de laatste benadering volgt.)
Sloten die u na verwijdert de mdl
instrument is ingeschakeld, kan worden bekeken door een SELECT
. uit te voeren tegen de performance_schema.metadata_locks
tafel. Zoals vermeld in de documenten, GET_LOCK
sloten hebben een OBJECT_TYPE
van 'USER LEVEL LOCK'
, zodat we onze zoekopdracht daarop kunnen filteren met een WHERE
clausule:
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>
De betekenissen van de kolommen in dit resultaat zijn meestal voldoende gedocumenteerd op https://dev.mysql.com/doc/refman/en/metadata-locks-table.html
, maar één punt van verwarring is vermeldenswaard:de OWNER_THREAD_ID
kolom doet niet bevatten de verbinding ID (zoals zou worden getoond in de PROCESSLIST
of geretourneerd door CONNECTION_ID()
) van de draad die het slot vasthoudt. Verwarrend genoeg wordt de term "thread-ID" soms gebruikt als synoniem van "verbindings-ID" in de MySQL-documentatie, maar dit is niet een van die keren. Als u de verbinding wilt bepalen ID van de verbinding met een slot (bijvoorbeeld om die verbinding te beëindigen met KILL
), moet u de PROCESSLIST_ID
. opzoeken die overeenkomt met de THREAD_ID
in de performance_schema.threads
tafel. Om bijvoorbeeld de verbinding te verbreken die mijn slot hierboven vasthield...
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)