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)