जवाबों:
InnoDB तालिकाओं और गुहाओं के लिए मार्को की कड़ी देखें।
MyISAM के लिए, एक मृत आसान नहीं है "यह अपमानजनक क्वेरी" समाधान है। आपको हमेशा एक प्रक्रिया सूची से शुरू करना चाहिए। लेकिन पूर्ण कीवर्ड को शामिल करना सुनिश्चित करें ताकि मुद्रित प्रश्नों को छोटा न किया जाए:
SHOW FULL PROCESSLIST;
यह आपको सभी मौजूदा प्रक्रियाओं, उनकी SQL क्वेरी और स्थिति की एक सूची दिखाएगा। अब आम तौर पर यदि एक ही क्वेरी कई अन्य को लॉक करने का कारण बन रही है तो इसे पहचानना आसान होना चाहिए। प्रभावित प्रश्नों की एक स्थिति होगी Locked
और आपत्तिजनक क्वेरी एक अस्थायी तालिका की तरह, संभवतः गहन रूप से प्रतीक्षा कर रही है।
यदि यह स्पष्ट नहीं है, तो आपको अपनी कटौती का कारण निर्धारित करने के लिए एसक्यूएल कटौती की अपनी शक्तियों का उपयोग करना होगा।
यदि आप InnoDB का उपयोग करते हैं और मुझे चलने वाले प्रश्नों की जाँच करने की आवश्यकता है
show engine innodb status;
जैसा कि मार्को के लिंक में बताया गया है। यह आपको लॉकिंग क्वेरी देगा, इसके द्वारा कितनी पंक्तियाँ / टेबल लॉक किए गए हैं आदि देखो।
उपयोग करने SHOW PROCESSLIST
में समस्या यह है कि आप तब तक ताले को नहीं देखेंगे जब तक कि अन्य प्रश्न पंक्तिबद्ध न हों।
कोशिश करें SHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
कोई भी उत्तर वर्तमान में मौजूद सभी लॉक को नहीं दिखा सकता है।
एक टर्मिनल में 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
उपरोक्त परिदृश्य में बंद है।
अन्य उत्तरों में दिए गए सुझाव अब तक कम से कम मदद नहीं करेंगे।
अस्वीकरण: मेरे पास जन्मजात नहीं है और मैं परेशान नहीं हुआ। शायद वह काम कर सके ।
AFAIK अभी भी 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