जवाबों:
यदि एक InnoDB टेबल को SELECT या DML (INSERT, UPDATE, DELETE) के माध्यम से एक्सेस किया जा रहा है, तो आपको मेटाडेटा लॉक की सही उम्मीद करनी चाहिए।
मेटाडेटा लॉकिंग पर MySQL प्रलेखन के अनुसार :
लेन-देन क्रमबद्धता सुनिश्चित करने के लिए, सर्वर को एक सत्र में डेटा परिभाषा भाषा (DDL) स्टेटमेंट करने के लिए एक सत्र की अनुमति नहीं देनी चाहिए, जो किसी अन्य सत्र में अपूर्ण लेनदेन में उपयोग किया जाता है। सर्वर लेन-देन के भीतर उपयोग की जाने वाली तालिकाओं पर मेटाडेटा ताले प्राप्त करके और लेन-देन समाप्त होने तक उन तालों के विचलन को हटाकर इसे प्राप्त करता है। एक मेज पर मेटाडेटा लॉक तालिका की संरचना में परिवर्तन को रोकता है। इस लॉकिंग एप्रोच का निहितार्थ है कि लेन-देन समाप्त होने तक एक सत्र के भीतर लेनदेन करने वाली तालिका का उपयोग डीडीएल बयानों में अन्य सत्रों द्वारा नहीं किया जा सकता है।
यह कहा जा रहा है, आपको यह निर्धारित करना चाहिए कि एक और डीबी सत्र मेज पर ताले लगा रहा है या नहीं। यदि इस तरह का सत्र एक अपूर्ण लेन-देन है, तो वहाँ है जहाँ पकड़ हो सकती है।
आप बस जल्दी से डिस्कस्पेस की जरूरत है, तो आप चला सकते हैं TRUNCATE TABLE
।
निम्नलिखित के रूप में इसे छोड़ने का प्रयास करने से पहले तालिका का नाम बदलने का प्रयास करें:
ALTER TABLE mydb.mytable RENAME mydb.mytabletodrop;
TRUNCATE TABLE mydb.mytabletodrop;
DROP TABLE mydb.mytabletodrop;
foo
। एक बार जब वे सभी कनेक्शन हो गए, तो ALTER TABLE
आगे बढ़ सकते हैं।
आपको यह पता लगाना चाहिए कि किस क्वेरी के कारण लेनदेन लॉक होता है:
SHOW ENGINE INNODB STATUS
और नाम का एक सेक्शन देखें TRANSACTION
। बाद में आपको डेटाबेस छोड़ने के लिए उस क्वेरी को मारना चाहिए।
संदर्भ: मुझे कैसे पता चलेगा कि कौन सा लेन-देन "टेबल मेटाडेटा लॉक" की प्रतीक्षा कर रहा है?
foo
नाम बदलेंfootodrop