MySQL 5.7 के बाद से, यह संभव है, लेकिन पहले performance_schema.setup_instruments
तालिका में mdl
साधन को सक्षम करने की आवश्यकता है। आप चलाकर अस्थायी रूप से यह कर सकते हैं (जब तक कि सर्वर अगले पुनरारंभ):
UPDATE performance_schema.setup_instruments
SET enabled = 'YES'
WHERE name = 'wait/lock/metadata/sql/mdl';
या स्थायी रूप से, (अपने my.cnf
फ़ाइल के [mysqld]
अनुभाग के लिए निम्न मंत्र जोड़कर या जो कुछ भी config फ़ाइलों MySQL अपनी स्थापना पर से पढ़ता):।
[mysqld]
performance_schema_instrument = 'wait/lock/metadata/sql/mdl=ON'
(स्वाभाविक रूप से, MySQL config परिवर्तन प्रभावी यदि आप बाद दृष्टिकोण ले बनाने के लिए पुन: प्रारंभ करने की आवश्यकता होगी)
ताले आप के बाद बाहर लेmdl
उपकरण सक्षम किया गया है performance_schema.metadata_locks
तालिका के विरुद्ध चलाकर देखा जा सकता है।के रूप में डॉक्स में बताया गया है, GET_LOCK
ताले 'USER LEVEL LOCK'
के OBJECT_TYPE
है, इसलिए हम एक 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
के साथ उस कनेक्शन को मारने के लिए) को निर्धारित करना चाहते हैं, तो आपको से 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)
ओपी आवेदन ताले के बारे में पूछ रहा है, और यह उनको नहीं दिखाता है। –
कृपया इस आदेश के साथ ताले को देखने के तरीके पर अपना उत्तर अपडेट करें। जहां तक मैं केवल आपको वर्तमान में निष्पादित आदेश दिखाऊंगा, न कि ताले से प्रभावित टेबल। – ooxi
@ooxi 'राज्य' पर 'MyISAM के लिए तालिका मेटाडाटा लॉक' की प्रतीक्षा करेगा; इनो डीबी के लिए पंक्ति स्तर के ताले 'शो इंजन इनो डीबी स्थिति' – danielpopa