2012-06-14 16 views
50

से सभी मौजूदा ताले दिखाएं GET_LOCK function का उपयोग करके किए गए सभी मौजूदा लॉक का चयन/दिखाने का कोई तरीका है?get_lock

ध्यान दें कि GET_LOCK ताले तालिका ताले से अलग हैं, साथ LOCK TABLES का अधिग्रहण उन जैसे - जो पता करने के लिए देखने का तरीका चाहते पाठकों उन ताले पढ़ना चाहिए Detecting locked tables (locked by LOCK TABLE)

उत्तर

15
SHOW FULL PROCESSLIST; 

आप

में ताले देखेंगे
+14

ओपी आवेदन ताले के बारे में पूछ रहा है, और यह उनको नहीं दिखाता है। –

+1

कृपया इस आदेश के साथ ताले को देखने के तरीके पर अपना उत्तर अपडेट करें। जहां तक ​​मैं केवल आपको वर्तमान में निष्पादित आदेश दिखाऊंगा, न कि ताले से प्रभावित टेबल। – ooxi

+0

@ooxi 'राज्य' पर 'MyISAM के लिए तालिका मेटाडाटा लॉक' की प्रतीक्षा करेगा; इनो डीबी के लिए पंक्ति स्तर के ताले 'शो इंजन इनो डीबी स्थिति' – danielpopa

0

एक और आसान तरीका उपयोग करने के लिए है:

mysqladmin debug 

यह त्रुटि लॉग में बहुत सारी जानकारी (ताले सहित) को डंप करता है।

+0

-1; मैंने सिर्फ एक टर्मिनल में नामित लॉक निकालने और फिर 'mysqladmin' को दूसरे से कॉल करके MySQL 5.7 पर परीक्षण किया। मेरे त्रुटि लॉग में डाली गई जानकारी में लॉक के लिए जो कुछ भी लिया गया था, उसमें कोई संदर्भ नहीं था। –

15

MySQL 5.7 से शुरू होने पर, प्रदर्शन स्कीमा GET_LOCK() फ़ंक्शन से संबंधित ताले सहित सभी मेटाडेटा ताले का खुलासा करती है।

http://dev.mysql.com/doc/refman/5.7/en/metadata-locks-table.html

+0

यह प्रश्न का सही उत्तर है। क्षमता 5.7 से पहले संस्करणों में मौजूद नहीं है। –

+0

इसने मुझे सही दिशा में इंगित किया, लेकिन पवित्र गाय ने मुझे यह जानने के लिए एक * बहुत * काम किया कि यह तालिका वास्तव में कुछ भी शामिल करने के लिए या एक बार मेरे सामग्रियों को समझने के लिए कैसे प्राप्त करें। दूसरों को एक ही संघर्ष को बचाने के लिए, मैंने [अपने निष्कर्ष लिखे हैं] (http://stackoverflow.com/a/42356351/1709587) यहां अपने स्वयं के उत्तर में। –

0

मैं निम्नलिखित जिस तरह अगर आप लॉक

select IS_USED_LOCK('lockname'); 

का नाम पता किया जा सकता है लेकिन मैं कैसे सभी के नाम सूचीबद्ध करने के लिए के बारे में कोई जानकारी नहीं मिली पाया देखें।

+1

यह उपयोगी है क्योंकि इसका उपयोग मेटा जानकारी प्राप्त करने के लिए किया जा सकता है कि किसके पास लॉक है और यदि आवश्यक हो तो क्वेरी को मार दें। –

+0

@ किसी भी कारण से आपने दस्तावेज़ों के लिंक को जोड़ने और 'IS_USED_LOCK' रिटर्न के बारे में जानकारी वापस लेने का कोई कारण क्यों चुना? ऐसा लगता है कि यह जानकारी उस जानकारी के बिना कम उपयोगी है; आपका तरीका, मुझे Google को फ़ंक्शन नाम दस्तावेज़ों को ढूंढना है, और मेरे सामने मौजूद जानकारी के बजाय, वास्तव में इस उत्तर का उपयोग करने में सक्षम होने के लिए जो कुछ भी लौटाता है, उस दस्तावेज़ में पढ़ना है। –

+0

परिवर्तन के बाद यह अब और नहीं कहता है। आप स्वतंत्र रूप से अपना जवाब बना सकते हैं। – arheops

0

Reference taken from this post:

तुम भी MySQL में ताला लगाने के लिए इस स्क्रिप्ट का उपयोग कर सकते हैं।

SELECT 
    pl.id 
    ,pl.user 
    ,pl.state 
    ,it.trx_id 
    ,it.trx_mysql_thread_id 
    ,it.trx_query AS query 
    ,it.trx_id AS blocking_trx_id 
    ,it.trx_mysql_thread_id AS blocking_thread 
    ,it.trx_query AS blocking_query 
FROM information_schema.processlist AS pl 
INNER JOIN information_schema.innodb_trx AS it 
    ON pl.id = it.trx_mysql_thread_id 
INNER JOIN information_schema.innodb_lock_waits AS ilw 
    ON it.trx_id = ilw.requesting_trx_id 
     AND it.trx_id = ilw.blocking_trx_id 
+0

-1; यह * टेबल * ताले खोजने के लिए एक तंत्र है, नहीं * नाम * ताले, और इसलिए सवाल के लिए अप्रासंगिक, साथ ही यह एक बहिष्कृत तालिका का उपयोग करता है - यदि आप इसे हाल ही में MySQL रिलीज पर चलाते हैं और 'शो वॉर्निंग' चलाते हैं तो आप बाद में देखें 'INFORMATION_SCHEMA.INNODB_LOCK_WAITS' को बहिष्कृत किया गया है और भविष्य में रिलीज़ में हटा दिया जाएगा। –

7

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) 
+1

+1। अच्छा लेखन, सब यहाँ सही है।PROCESSLIST_ID बनाम THREAD_ID के बारे में, यह वास्तव में भ्रम पैदा करने वाला एक क्षेत्र है, जिसमें ऐतिहासिक प्रक्रियाएं हैं जिनमें शो प्रोसेसलिस्ट है। –

2

को मारने के लिए आप सिर्फ यह निर्धारित करने के लिए एक विशेष नामित ताला वर्तमान में आयोजित किया जाता है चाहते हैं, तो आप उपयोग कर सकते हैं IS_USED_LOCK:

SELECT IS_USED_LOCK('foobar'); 

यदि कुछ कनेक्शन लॉक रखता है, तो उस कनेक्शन की आईडी वापस कर दी जाएगी; अन्यथा, परिणाम NULL है।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^