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/hi/metadata-locks-table.html
, लेकिन एक भ्रम की बात ध्यान देने योग्य है:OWNER_THREAD_ID
कॉलम नहीं करता है कनेक्शन को शामिल करें आईडी (जैसे PROCESSLIST
में दिखाया जाएगा) या CONNECTION_ID()
by द्वारा लौटाया गया ) उस धागे का जो ताला रखता है। भ्रामक रूप से, "थ्रेड आईडी" शब्द को कभी-कभी 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)