लंबित लेनदेन के साथ MySQL तालिका को हटाना


10

क्या MySQL (अधिमानतः फाइल सिस्टम स्तर पर) में लंबित लेनदेन के साथ एक InnoDB तालिका या डेटाबेस को हटाने का एक तरीका है?

क्या हुआ:

मैं MySQL 5.5.28 का उपयोग करता हूं और LOAD DATA INFILE…एक विशाल डेटा सेट (300M पंक्तियों) को एक InnoDB तालिका में आयात करने के लिए दौड़ा । मैंने set autocommit = 0;पहले इस्तेमाल नहीं किया । दुर्भाग्य से, mysqldआयात के बीच में ही रोक दिया गया था।

जब मैं पुनः आरंभ mysqlकरता हूं , तो यह इस तरह से संदेशों के साथ सिस्टम लॉग भरने वाले लेनदेन को वापस करने की कोशिश करता है:

mysqld_safe [4433]: 121212 16:58:52 InnoDB: समाप्त होने के लिए 1 सक्रिय लेनदेन की प्रतीक्षा कर रहा है

समस्या यह है कि रोल बैक 25 घंटे से अधिक समय तक चल रहा है, जिसके दौरान mysqldकोई सॉकेट कनेक्शन स्वीकार नहीं कर रहा है।

मैं अभी नहीं हटा सकता /var/lib/mysql/*और खरोंच से शुरू कर सकता हूं क्योंकि इस मशीन पर कुछ अन्य InnoDB डेटाबेस / टेबल भी हैं। हालाँकि, समस्याग्रस्त तालिका एक अलग डेटाबेस में एकमात्र तालिका है। संपूर्ण तालिका या संपूर्ण डेटाबेस को हटाना कोई समस्या नहीं है क्योंकि मैं बाद में सभी डेटा को पुन: आयात कर सकता हूं।

जवाबों:


8

ऐसा कुछ भी नहीं है जो आप वास्तव में कर सकते हैं, क्योंकि ibdata1 के अंदर UNDO तालिकाओं के माध्यम से एक रोलबैक किया जा रहा है , जिसे बहुत अधिक बढ़ जाना चाहिए था।

यदि आप mysqld प्रक्रिया को मारते हैं और mysql को पुनः आरंभ करते हैं, तो यह बस पिकअप होगा जहां यह क्रैश रिकवरी चक्र के भाग के रूप में छोड़ा गया था।

अस्वीकरण: डेटा हानि के लिए जिम्मेदार नहीं है

आप अन्य तालिकाओं के लिए डेटा हानि के परिणामस्वरूप क्या कर सकते हैं, लेकिन कुछ ऐसा है जो आप InnoDB के सामान्य क्रैश रिकवरी चक्र को रोकने के लिए कर सकते हैं।

एक स्टार्टअप विकल्प है, जिसे innodb_force_recovery कहा जाता है , जो आपको InnoDB क्रैश रिकवरी के विभिन्न चरणों को बायपास करने की अनुमति देता है।

के अनुसार InnoDB रिकवरी जबरदस्ती पर MySQL प्रलेखन , यहाँ सेटिंग्स और इसके प्रभाव हैं:

1 (SRV_FORCE_IGNORE_CORRUPT)

यदि कोई भ्रष्ट पृष्ठ का पता लगाता है तो भी सर्वर को चलने दें। भ्रष्ट सूचकांक रिकॉर्ड्स और पेजों पर tbl_name जम्प करने के लिए सेलेक्ट * बनाने की कोशिश करें, जो डंपिंग टेबल में मदद करता है।

2 (SRV_FORCE_NO_BACKGROUND)

मास्टर थ्रेड को चलने से रोकें। यदि पर्ज ऑपरेशन के दौरान कोई दुर्घटना होती है, तो यह पुनर्प्राप्ति मान रोकता है।

3 (SRV_FORCE_NO_TRX_UNDO)

क्रैश रिकवरी के बाद ट्रांजैक्शन रोलबैक न चलाएं।

4 (SRV_FORCE_NO_IBUF_MERGE)

सम्मिलित करें बफ़र मर्ज कार्रवाई रोकें। यदि वे दुर्घटना का कारण बनते हैं, तो उन्हें न करें। तालिका के आँकड़ों की गणना न करें।

5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

डेटाबेस शुरू करते समय पूर्व लॉग पर मत देखो: InnoDB प्रतिबद्ध अधूरे लेनदेन को भी मानता है।

6 (SRV_FORCE_NO_LOG_REDO)

पुनर्प्राप्ति के संबंध में रीडो लॉग रोल-फ़ॉरवर्ड न करें।

यूएनडीओ और REDO लॉग्स में दफन बदलाव के साथ, आप के जोखिम को चलाते हैं

  • डेटा खोने का मतलब लिखना होगा
  • डेटा रखने का मतलब है हटाना

यदि आप खराब साइड इफेक्ट की उम्मीद करते हैं, तो संपूर्ण / var / lib / mysql का बैकअप लें और यदि आप ibdata1, ib_logfile0, और ib_logfile1 की प्रतिलिपि बनाना चाहते हैं और सामान्य रिकवरी करना चाहते हैं, तो इसे कहीं रख दें।

यदि mysql पूरी तरह से एक मोड में है

  • आपत्तिजनक तालिका को छोड़कर सभी डेटा mysqldump
  • शटडाउन mysql
  • / var / lib / mysql को छोड़कर / var / lib / mysql / mysql में सब कुछ हटा दें
  • mysql शुरू करें
  • mysqldump पुनः लोड करें

गुफा: सुनिश्चित करें कि आप सब कुछ बैकअप !!!

आशा है कि ये आपकी मदद करेगा !!!


1

इस सप्ताह मेरी भी ऐसी ही स्थिति थी।

और एक परीक्षण सर्वर पर एक पूर्ण बैकअप को बहाल करने और विशाल लंबित लेनदेन के साथ तालिकाओं को छोड़ने, हटाने, या मारने का प्रयास करने के चार पुनरावृत्तियों के बाद, हम अंततः शुक्रवार दोपहर को मिल गए और बस इसे चलाने का फैसला किया। तीन दिनों में, लेन-देन लापरवाह सर्वर लोड के साथ समाप्त हो गया और डेटाबेस ठीक था। जो .fm फ़ाइलों और mysql तालिकाओं पर किसी भी मैनुअल ऑपरेशन से बहुत बेहतर था, जिसने कोशिश की थी और विफल रहा था।

मेरा समाधान: इसे हटाएं नहीं । लंबित लेन-देन को समाप्त करने की अनुमति दें, भले ही आपको कुछ दिनों के लिए अन्य संचालन बंद करना पड़े, या कहीं पर कुछ डिस्क स्थान ढूंढना पड़े, या अपने दास सर्वर को लोड लेने दें।

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