От 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
, но си струва да се отбележи един момент на объркване:OWNER_THREAD_ID
колона не съдържа връзката Идентификатор (като да се показва в PROCESSLIST
или върнати от CONNECTION_ID()
) на конеца, който държи ключалката. Объркващо е, че терминът "идентификатор на нишка" понякога се използва като синоним на "идентификатор на връзката" в документацията на MySQL, но това не един от онези времена. Ако искате да определите връзката Идентификатор на връзката, която държи заключване (например, за да прекратите тази връзка с 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)