Dari MySQL 5.7 dan seterusnya, ini dimungkinkan, tetapi harus terlebih dahulu mengaktifkan mdl
instrumen di performance_schema.setup_instruments
meja. Anda dapat melakukan ini untuk sementara (sampai server dimulai ulang berikutnya) dengan menjalankan:
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
Atau secara permanen, dengan menambahkan mantra berikut ke [mysqld]
bagian my.cnf
your Anda file (atau file konfigurasi apa pun yang dibaca MySQL dari instalasi Anda):
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(Secara alami, MySQL perlu di-restart untuk membuat perubahan konfigurasi berlaku jika Anda mengambil pendekatan yang terakhir.)
Kunci yang Anda lepas setelah mdl
instrumen telah diaktifkan dapat dilihat dengan menjalankan SELECT
terhadap performance_schema.metadata_locks
meja. Seperti yang tercantum dalam dokumen, GET_LOCK
kunci memiliki OBJECT_TYPE
dari 'USER LEVEL LOCK'
, sehingga kami dapat memfilter kueri kami ke mereka dengan WHERE
klausa:
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>
Arti kolom dalam hasil ini sebagian besar didokumentasikan secara memadai di https://dev.mysql.com/doc/refman/en/metadata-locks-table.html
, tetapi satu hal yang membingungkan perlu diperhatikan:OWNER_THREAD_ID
kolom tidak berisi koneksi ID (seperti akan ditampilkan di PROCESSLIST
atau dikembalikan oleh CONNECTION_ID()
) dari utas yang menahan kunci. Yang membingungkan, istilah "ID utas" terkadang digunakan sebagai sinonim dari "ID koneksi" dalam dokumentasi MySQL, tetapi ini tidak salah satu dari waktu itu. Jika Anda ingin menentukan koneksi ID koneksi yang mengunci (misalnya, untuk mematikan koneksi tersebut dengan KILL
), Anda harus mencari PROCESSLIST_ID
yang sesuai dengan THREAD_ID
di performance_schema.threads
meja. Misalnya, untuk mematikan koneksi yang menahan kunci saya di atas...
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)