मैं mysql ताले कैसे दिखा सकता हूं?


44

क्या वैसे भी सभी ताले हैं जो एक mysql डेटाबेस में सक्रिय हैं?


1
आप INNODB_LOCK_WAITS और INNODB_LOCKS तालिकाओं को क्वेरी कर सकते हैं।

जवाबों:


39

InnoDB तालिकाओं और गुहाओं के लिए मार्को की कड़ी देखें।

MyISAM के लिए, एक मृत आसान नहीं है "यह अपमानजनक क्वेरी" समाधान है। आपको हमेशा एक प्रक्रिया सूची से शुरू करना चाहिए। लेकिन पूर्ण कीवर्ड को शामिल करना सुनिश्चित करें ताकि मुद्रित प्रश्नों को छोटा न किया जाए:

SHOW FULL PROCESSLIST;

यह आपको सभी मौजूदा प्रक्रियाओं, उनकी SQL क्वेरी और स्थिति की एक सूची दिखाएगा। अब आम तौर पर यदि एक ही क्वेरी कई अन्य को लॉक करने का कारण बन रही है तो इसे पहचानना आसान होना चाहिए। प्रभावित प्रश्नों की एक स्थिति होगी Lockedऔर आपत्तिजनक क्वेरी एक अस्थायी तालिका की तरह, संभवतः गहन रूप से प्रतीक्षा कर रही है।

यदि यह स्पष्ट नहीं है, तो आपको अपनी कटौती का कारण निर्धारित करने के लिए एसक्यूएल कटौती की अपनी शक्तियों का उपयोग करना होगा।


20

यदि आप InnoDB का उपयोग करते हैं और मुझे चलने वाले प्रश्नों की जाँच करने की आवश्यकता है

show engine innodb status;

जैसा कि मार्को के लिंक में बताया गया है। यह आपको लॉकिंग क्वेरी देगा, इसके द्वारा कितनी पंक्तियाँ / टेबल लॉक किए गए हैं आदि देखो।

उपयोग करने SHOW PROCESSLISTमें समस्या यह है कि आप तब तक ताले को नहीं देखेंगे जब तक कि अन्य प्रश्न पंक्तिबद्ध न हों।


20

कोशिश करें SHOW OPEN TABLES:

show open tables where In_Use > 0 ;

मुझे लगता है कि यह तुरंत उपयोग ताले में पहचानने का सबसे अच्छा तरीका है, खासकर यदि आपके पास कई डेटाबेस और सैकड़ों कनेक्शन हैं।
नेलारो

7

इस कमांड का उपयोग करना

SHOW PROCESSLIST

वर्तमान में चल रही सभी प्रक्रिया को दिखाएगा, जिसमें तालिकाओं पर लॉक का अधिग्रहण करने वाली प्रक्रिया भी शामिल है।


7

कोई भी उत्तर वर्तमान में मौजूद सभी लॉक को नहीं दिखा सकता है।

एक टर्मिनल में mysql में यह करो।

start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there

स्पष्ट रूप से ऊपर का लेनदेन लॉक है, क्योंकि लेन-देन अभी भी सक्रिय है। लेकिन अभी कोई क्वेरी नहीं चल रही है और कोई भी कहीं भी (अभी तक कम से कम) लॉक का इंतजार कर रहा है।

INFORMATION_SCHEMA.INNODB_LOCKSखाली है, जो समझ में आता है कि दस्तावेज दिया गया है , क्योंकि केवल एक ही लेन-देन है और वर्तमान में कोई भी किसी ताले का इंतजार नहीं कर रहा है। इसके अलावा INNODB_LOCKSवैसे भी मान्य नहीं है।

SHOW ENGINE INNODB STATUSबेकार है: someTableबिल्कुल उल्लेख नहीं है

SHOW FULL PROCESSLIST खाली है, क्योंकि अपराधी वास्तव में अभी एक क्वेरी नहीं चला रहा है।

आप उपयोग कर सकते हैं INFORMATION_SCHEMA.INNODB_TRX, performance_schema.events_statements_historyऔर performance_schema.threadsप्रश्नों को निकालने के लिए के रूप में में उल्लिखित है कि किसी भी सक्रिय लेनदेन अतीत में मार डाला है मेरे दूसरे सवाल का जवाब है, लेकिन मैं किसी भी तरह से पार चलो देखने के लिए कि नहीं किया है someTableउपरोक्त परिदृश्य में बंद है।

अन्य उत्तरों में दिए गए सुझाव अब तक कम से कम मदद नहीं करेंगे।

अस्वीकरण: मेरे पास जन्मजात नहीं है और मैं परेशान नहीं हुआ। शायद वह काम कर सके


6

AFAIK अभी भी MYSQL में कोई देशी तरीका नहीं है, लेकिन मैं निर्दोष का उपयोग करता हूं । यह मुफ़्त है और इसके साथ ही अन्य कार्यक्षमता भी है।

इसके अलावा निर्दोष उपकरण का उपयोग करने के बारे में अधिक जानकारी के लिए इस लिंक को देखें ।


4

इस पद से संदर्भ लिया गया।

आप स्क्रिप्ट के नीचे उपयोग कर सकते हैं:

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.