कैसे एक InnoDB तालिका पुनर्प्राप्त करने के लिए जिनकी फाइलें चारों ओर ले जाया गया


13

इसलिए मेरे पास एक परीक्षण डीबी सर्वर है जो एक प्रतिकृति स्ट्रीम पर सेटअप किया गया था। नाम से अधिक एक अनुकूलन के माध्यम से आया था कि दास दासादिर पर जल्दी से अंतरिक्ष भर गया। माईसक्ल डट कर बस कुछ और जगह की प्रतीक्षा कर रहा था।

यह डेटादिर एक फाइल सिस्टम है जिसका उपयोग केवल mysql के डेटादिर के रूप में किया जाता है ताकि मुक्त करने के लिए कुछ और न हो।

मेरे पास 4 गिग इनोडब टेस्ट टेबल था जो प्रतिकृति स्ट्रीम का हिस्सा नहीं था इसलिए मुझे लगा कि मैं यह देखने के लिए कुछ कोशिश करूंगा कि क्या यह काम करेगा, और एक परीक्षण वातावरण होने के नाते मैं बहुत चिंतित नहीं था अगर चीजें बुरी तरह से गलत हो गईं।

यहां मैंने जो कदम उठाए हैं

  1. मैं जिस टेबल को हिलाने जा रहा था, उसे फ्लश कर दिया
  2. इस पर एक रीड लॉक लगाया (भले ही इसे कुछ भी नहीं लिख रहा था और यह प्रतिकृति स्ट्रीम में नहीं था)
  3. एक। प्रणाली पर
  4. मेज खोल दी
  5. उस तालिका को काट दिया गया - इसने अनुकूलन को समाप्त करने के लिए पर्याप्त स्थान मुक्त कर दिया और प्रतिकृति को फिर से शुरू कर दिया।
  6. स्लाव करना / बंद करना mysql
  7. Tmp से फ़ाइल की प्रतिलिपि डेटा dir पर वापस करें
  8. Mysql को पुनरारंभ करें

.Err लॉग में कुछ भी नहीं दिखता है, चीजें अच्छी लगती हैं। मैं कनेक्ट करता हूं और mydb का उपयोग करता हूं; और टेबल को देखने के लिए मैं शो टेबल में गड़बड़ कर रहा था। लेकिन, अगर मैं कोशिश करता हूं

select * from testtable limit 10;

मुझे त्रुटि मिलती है

ERROR 1146 (42S02): Table 'mydb.testtable' doesn't exist

मैं अब तक जो कुछ भी बता सकता हूं उससे मैं ठीक अन्य सभी तालिकाओं से पढ़ सकता हूं और किसी भी शिकायत को फिर से शुरू किया गया है।

क्या इस बिंदु से उबरने के लिए मैं कुछ कर सकता हूं? मैं इसे खरोंच से पुनर्निर्माण कर सकता हूं यदि आवश्यकता हो, लेकिन उत्सुक था कि दूसरों ने इस उद्यम के बारे में सामान्य रूप से क्या सोचा था। क्या मेरे द्वारा उठाए गए कदमों की श्रृंखला के बारे में कुछ था जो डब्ल्यू / अधिक निर्दोष परिणामों को समाप्त करेगा?

क्या होगा अगर यह एक परीक्षण सर्वर नहीं था जो मैं बस 'इसे जीवित नहीं कर सकता' और देखो क्या होता है? अगर मुझे ऐसा करना है तो प्रोडक्शन स्लेव पर अस्थायी रूप से स्पेस खाली करने का सबसे अच्छा तरीका क्या होगा?

जवाबों:


15

TRUNCATE TABLE के बारे में ज्यादातर लोग भूल जाते हैं कि TRUNCATE TABLE DDL है न कि DML । InnoDB में, ibdata1 के भीतर मेटाडेटा में InnoDB तालिकाओं की क्रमांकित सूची होती है। TRUNCATE टेबल का उपयोग करने के कारण शिफ्ट करने के लिए InnoDB तालिका की आंतरिक मेटाडेटा आईडी होती है। ऐसा इसलिए होता है क्योंकि TRUNCATE TABLE प्रभावी रूप से निम्नलिखित कार्य करता है:

उदाहरण: Mydb.mytb नामक एक InnoDB तालिका को छोटा करने के लिए

USE mydb
CREATE TABLE newtb LIKE mytb;
ALTER TABLE mytb RENAME oldtb;
ALTER TABLE newtb RENAME mytb;
DROP TABLE oldtb;

नए mytb इस प्रकार एक अलग आंतरिक मेटाडेटा आईडी होगा।

जब आपने .ibd फ़ाइल को किसी अन्य स्थान पर कॉपी किया है, तो .ibd में यह मूल आंतरिक मेटाडेटा आईडी है। बस .ibd फ़ाइल को वापस रखने से ibdata1 में से किसी एक के साथ आंतरिक मेटाडेटा आईडी के सामंजस्य का कारण नहीं बनता है।

आपको यह करना चाहिए था:

InnoDB तालिका की .ibd फ़ाइल की प्रतिलिपि बनाएँ। फिर, इसे चलाएं

ALTER TABLE tablename DISCARD TABLESPACE;

इसे बाद में वापस लाने के लिए, .ibd फ़ाइल को वापस डेटादिर में कॉपी करें और फिर चलाएं

ALTER TABLE tablename IMPORT TABLESPACE;

यह आंतरिक मेटाडेटा आईडी को संरक्षित करता है।

सुनिश्चित करें कि .frm हमेशा मौजूद है।

मैंने एक बार एक ग्राहक को 30 InnoDB तालिकाओं को बहाल करने में मदद की थी जो उसने उसी तरीके से रखी थी। मुझे एक अन्य DB सर्वर का उपयोग करना था और सही आंतरिक मेटाडाटा आईडी का शिकार करने के लिए InnoDB तालिकाओं को जोड़ने और छोड़ने के साथ कुछ गेम खेलना था।

क्लाइंट को यह लेख मिला: http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file । हमने इसका इस्तेमाल किया और इसने काफी मदद की। मुझे उम्मीद है इससे आपको मदद मिली होगी।


1
मेरे पास 2 डेटाबेस हैं जहां सभी टेबल कहते हैं Table 'X' doesn't exist in engine। क्या मुझे प्रत्येक तालिका के लिए उपरोक्त विधि करनी है या क्या इसे ठीक करने के बेहतर तरीके हैं?
पपनिटो

-2

मैंने अपने मैक के साथ अनुभव किया, एक दोस्त को बेचने से पहले केवल एक्सएमपीपी फ़ोल्डर को मेरी हार्ड ड्राइव पर कॉपी करें। (नहीं सफलता) दुर्भाग्य से, यह मेरे लिए परेशानी ला रहा था, क्योंकि मैंने निम्नलिखित चरणों की कोशिश की: - मैं ताजा XAMPP स्थापित करता हूं और अपने नए मैक पर पूरे \ httdocs और var \ mysql की प्रतिलिपि बनाता हूं, जो केवल .fr और .ibd के साथ db करते हैं, काम नहीं कर रहा, मैं अभी भी PHPMyAdmin के अंदर तालिकाओं का उपयोग नहीं कर सकता ... - मैंने उसी xampp संस्करण को स्थापित करने और उपरोक्त चरणों को दोहराने की कोशिश की, अभी भी काम नहीं कर रहा है। - बिस्तर पर जाने का फैसला किया।

(SUCCESS) - आज सुबह, मैं अपना बैकअप डिस्क लाया और विंडोज - के साथ कोशिश की - विंडोज के लिए ताजा लेटेस्ट XAMPP इंस्टॉल करें, c: \ xampp - मेरे पास अपने बैकअप \ httdocs में से एक वेबसाइट (फोल्डर) है और अंदर डेटाबेस डेटाबेस मेल करें var \ mysql मेरी विंडो 7 में READY हैं, मैं सिर्फ एक वेबसाइट के साथ प्रयास करना चाहता हूं, फिर बाकी का प्रयास करें क्योंकि मेरे पास httdocs \ n और \ var \ mysql के अंदर कई परियोजनाएं हैं - मैं विंडोज़ के लिए httdocs \ फ़ोल्डर का उल्लेख करता हूं c: \ xampp \ n httdocs और \ varam mysql को c: \ xampp \ mysql \ data पर कॉपी करें

नहीं कम से कम मैं ib_logfile0, ib_logfile1, ibdata1 को अपनी बैकअप फ़ाइल से xampp c: \ xampp \ mysql \ data की प्रतिलिपि बनाता हूं

मैं http: // localhost / mywebsite को रिफ्रेश करता हूं

वाह वाह ... यह काम कर रहा है ...

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