2008-09-15 18 views
12

मैं एक MySQL 5.0.45 डेटाबेस से कई पंक्तियों को हटाने के लिए कोशिश कर रहा हूँ:MySQL: "ताला प्रतीक्षा टाइमआउट को पार कर"

Lock wait timeout exceeded; try restarting transaction 
:

delete from bundle_inclusions; 

ग्राहक थोड़ी देर के लिए काम करता है और उसके बाद त्रुटि देता है

यह संभव है कि वहां कुछ असामान्य लेनदेन हैं जिनके पास इस तालिका पर ताला है, लेकिन मुझे इस तरह की ताले को टंप करने के लिए इस प्रक्रिया की आवश्यकता है। मैं MySQL में लॉक कैसे तोड़ सकता हूं?

उत्तर

19

मैं एरिक के साथ सहमत; ट्रंकेट टेबल जाने का रास्ता है। हालांकि, अगर आप का उपयोग करता है, तो नहीं कर सकते कि किसी कारण से (उदाहरण के लिए, यदि आप नहीं है वास्तव में तालिका में प्रत्येक पंक्ति को हटाना चाहते हैं), आप निम्नलिखित विकल्पों की कोशिश कर सकते हैं:

  • पंक्तियां हटाएं छोटे बैचों में (उदाहरण के लिए बंडल_इनक्लियंस से हटाएं जहां आईडी के बीच आईडी है? और?)
  • यदि यह एक माईसैम तालिका है (वास्तव में, यह इनो डीबी के साथ भी काम कर सकती है), DELETE से पहले एक लॉक टेबल जारी करने का प्रयास करें। यह गारंटी देनी चाहिए कि आपके पास विशेष पहुंच है।
  • यदि यह एक InnoDB तालिका है, तो के बाद टाइमआउट होता है, तो INNODB स्थिति दिखाएं। इससे आपको कुछ अंतर्दृष्टि मिलनी चाहिए कि लॉक अधिग्रहण क्यों विफल हुआ।
  • यदि आपके पास सुपर विशेषाधिकार है तो आप यह देखने के लिए सभी कनेक्शन (यदि कोई हैं) तालिका का उपयोग कर रहे हैं, और फिर आप जिस प्रतिस्पर्धा के साथ प्रतिस्पर्धा कर रहे हैं उससे छुटकारा पाने के लिए किल का उपयोग करें।

मुझे यकीन है कि कई अन्य संभावनाएं हैं; मुझे उम्मीद है कि इनमें से एक मदद है।

3

अनुमान: काटना तालिका bundle_inclusions

5

लिनक्स: mysql विन्यास में (/etc/my.cnf या /etc/mysql/my.cnf), सम्मिलित/संपादित इस लाइन

innodb_lock_wait_timeout = 50 

पर्याप्त (यह सेकंड में है) मूल्य में वृद्धि, डेटाबेस पुनरारंभ करें, परिवर्तन करें। फिर परिवर्तन को वापस करें और दोबारा शुरू करें।

2

मेरे पास एक ही समस्या थी, बिना किसी अंत के एक दुष्ट लेनदेन। मैंने mysqld प्रक्रिया को पुनरारंभ किया। आपको एक टेबल को छोटा करने की आवश्यकता नहीं है। आप उस दुष्ट लेनदेन से डेटा खो सकते हैं।

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