MySQL टेबल्स को .ibd, .frm और mysqllogbin फ़ाइलों से पुनर्स्थापित करना


10

किसी कारण से, जब मैं अपने टेबल (जो MySQL या phpmyadmin पर होता है) .frmऔर .ibdफाइलों में संग्रहीत करने की कोशिश करता हूं, तो यह मुझे एक सिंटैक्स त्रुटि देता है, या यह कहता है कि यह मौजूद नहीं है।

मैंने दूसरी पोस्ट पढ़ी है, जो इसी तरह की समस्या थी, लेकिन मुझे नहीं पता कि कैसे innodb_file_per_tableसक्षम होना चाहिए, और कैसे मैं वास्तव में भ्रमित हूं। मैंने अपनी mysql-bin.000002फ़ाइल की एक प्रतिलिपि को एक txt फ़ाइल में भी बदल दिया ताकि मैं देख सकूँ कि मेरे डेटाबेस से डेटा पूरी तरह से नहीं खोया है।

डेटाबेस पिछले साल बनाया गया था। मेरे पास उन mysql-bin.00000फ़ाइलों में से 6 हैं , लेकिन किसी कारण से .000002यह सबसे बड़ी है। अभी, मेरे पास .ibdऔर .frmमेरे सभी डेटाबेस के लिए फाइलें हैं, लेकिन मैं एक नुकसान में हूं कि कैसे मैं इसे MySQL में वापस ला सकता हूं, या कम से कम कुछ मैं पढ़ सकता हूं।

मैं विंडोज 2003 सर्वर पर WampServer 2.4 और MySQL 5.6.12 का उपयोग कर रहा हूं। इसके अलावा, क्या मैं InnoDB में एक प्लगइन डाउनलोड करने वाला हूं?


नहीं, यह पिछले साल बनाया गया था। मेरे पास 6 mysql-bin.00000 फाइलें हैं, लेकिन किसी कारण से .000002 सबसे बड़ी है। अभी, मेरे पास अपने सभी डेटाबेस के लिए .ibd और .frm फाइलें हैं, लेकिन मैं एक खोई हुई स्थिति में हूं कि कैसे मैं इसे MySQL में वापस ला सकता हूं, या कम से कम कुछ मैं पढ़ सकता हूं।
गाड़ी

जवाबों:


20

मैंने अंत में बहुत परीक्षण और त्रुटि के माध्यम से अपनी समस्या का समाधान किया। उन लोगों के लिए जिनके पास अपनी मूल ibdata1 फ़ाइल नहीं है, और उनके पास केवल .frm और .ibd फाइलें हैं, यहां बताया गया है कि मैंने अपना डेटा कैसे पुनर्स्थापित किया।

  1. MySQL उपयोगिताओं को डाउनलोड और स्थापित करें -> http://dev.mysql.com/downloads/utilities
  2. MySQL उपयोगिता, mysqlfrm को खोलने के लिए अपने कमांड / टर्मिनल में जाएं, और अपनी तालिका की संरचना को खोजने के लिए इसका उपयोग करें जिसे आपको पुनर्स्थापित करने की आवश्यकता है। मैंने ऐसा कैसे किया, क्या मैं mysqlfrm के फ़ाइल स्थान में cd'ed था, फिर "mysqlfrm --server = उपयोगकर्ता: pwd @ localhost --port = 3307" path_to_.frf_file "> table_name.txt" दर्ज किया। .Txt फ़ाइल को उसी फ़ोल्डर में सहेजा जाना चाहिए जहां आपकी उपयोगिताएँ सहेजी गई हैं यदि आपने यह निर्दिष्ट नहीं किया है कि आप कहाँ जाना चाहते हैं।
  3. पाठ फ़ाइल में, आप सृजन तालिका विवरण देखेंगे, जिसमें आपकी तालिका के सभी कॉलम और जानकारी (मूल रूप से, मूल संरचना) शामिल हैं। उस सभी जानकारी के साथ उस क्रिएट स्टेटमेंट को कॉपी करें।
  4. अपने MySQL कमांड में, एक नया डेटाबेस बनाएं (DATEABASE डेटाबेस_नाम बनाएं)। इसे अपने मूल डेटाबेस नाम के समान नाम दें।
  5. नए डेटाबेस के अंदर एक नई तालिका बनाएं - इसमें फ़ोल्डर के समान नाम नहीं है। आप कमांड प्रॉम्प्ट के अंदर नई तालिका बना सकते हैं, लेकिन मैंने PhpMyAdmin में अपनी तालिका बनाई, एक मुफ्त सॉफ्टवेयर टूल जो वेब पर MySQL के प्रशासन को संभालता है। मैंने बस PhpMyAdmin पर डेटाबेस पर क्लिक किया, फिर SQL तालिका, और # 3 से तालिका संरचना को चिपकाया। (एक साइड नोट के रूप में, मुझे हमेशा त्रुटि मिली अगर मैंने अपने कमांड प्रॉम्प्ट में अपनी तालिकाओं का नाम "तालिका" रखा है, इसलिए उस नाम से बचने की कोशिश करें)।
  6. अपने MySQL कमांड पर, अपने डेटाबेस में जाएं, और "ALTER TABLE table_name DISCARD TABLESPACE" दर्ज करें, जो अनिवार्य रूप से इस तालिका की .ibd फ़ाइल को हटा देगा।
  7. अपनी मूल तालिका (जिस तालिका को आप पुनर्स्थापित करना चाहते हैं) की .ibd फ़ाइल को अभी-अभी हटाए गए .ibd फ़ाइल को बदलने के लिए नई बनाई गई तालिका में कॉपी करें। अपनी प्रारंभिक .ibd फ़ाइल को नई बनाई गई तालिका के नाम में बदलें। यह पुरानी .ibd फ़ाइल की नकल करेगा जिसे आपने अभी हटाया है। आप इस फ़ोल्डर को अपने कंप्यूटर पर नए बनाए गए डेटाबेस फ़ोल्डर के तहत MySQL डेटा फ़ोल्डर में पा सकते हैं।
  8. अपने MySQL कमांड पर वापस जाएं, अपने डेटाबेस में जाएं, और "ALTER TABLE table_Name महत्वपूर्ण आयात करें" दर्ज करें। आपको "चेतावनी" (1) त्रुटि-प्रकार का विवरण प्राप्त होगा, लेकिन इसे अनदेखा करें।
  9. और हो गया! यदि आप अपनी नई तालिका तक पहुँचने का प्रयास करते हैं, तो इसमें आपकी पुरानी तालिका का सारा डेटा होना चाहिए।

मुझे आशा है कि इसने मदद की, और मुझे बताएं कि क्या आपके पास कोई प्रश्न या टिप्पणी है! इसके अलावा, अन्य विवरणों के लिए http://www.chriscalender.com/?tag=innodb-error-tablespace-id-in-file देखें।


महान निर्देश, लेकिन यह केवल MySQL 5.6 के साथ काम करता है ! 5.5 पर Got error -1 from storage engineआपको चलाते समय त्रुटि मिलेगी IMPORT TABLESPACE। लेकिन मेरे लिए MySQL 5.6 ने उन तालिकाओं के लिए काम किया जो MySQL 5.5 का उपयोग करके बनाए गए थे, इसलिए यह सब अच्छा है;)। यदि आप 5.5 के साथ फंस गए हैं, तो आपको उस क्रिस्पेन्डर लिंक के निर्देशों का पालन करना होगा जिसे आपने पेश किया था।
ओस्ट्रोकैच

@carment मैंने आपके निर्देशों का पालन किया, लेकिन मैं ERRPR का सामना करता हूं: अंतरिक्ष 13635, अंतरिक्ष नाम <dbname> / <tblname> में पेज नंबर 1767006713 पर पहुंचने का प्रयास कर रहा हूं, जो कि टेबलस्पॉट बाउंड के बाहर है। क्या आप मेरा मार्गदर्शन कर सकते हैं कि मैंने क्या किया होगा?
मोहित मेहता

इसने मुझे एक टेबल को पुनः बनाने में समय का एक गुच्छा बचाया। विधि अभी भी 2016 में MySQL 5.7.17
एंडी मर्सर

@ostrokach ऐसा इसलिए लगता है क्योंकि आपने innodb_file_per_tableसक्षम नहीं किया है ।
यवन

आपने बस .. बहुत लंबे सफर के बाद मुझे बचाया, धन्यवाद!
अमृत ​​सबजारो

4

मुख्य InnoDB डेटा फ़ाइल - आमतौर पर नाम ibdata- आपके लिए आवश्यक है MySQL आपकी .ibd फ़ाइलों को समझने में सक्षम हो।

यदि आपको बाइनरी फ़ाइलों का उपयोग करके सर्वरों के बीच डेटा स्थानांतरित करने की आवश्यकता है, तो आपको MySQL को सफाई से रोकना चाहिए और फिर निर्देशिकाओं के बीच ibdata फ़ाइल (ओं) सहित सभी डेटा फ़ाइलों को स्थानांतरित करना चाहिए ।

विंडोज पर सर्वर के बीच डेटा को स्थानांतरित करने का एक अधिक विश्वसनीय तंत्र का उपयोग करना होगा ( mysqldump) या PHPMyAdmin (या एक समान उपकरण) से डेटाबेस निर्यात।

यदि बाइनरी लॉगिंग को पूरे समय सक्षम किया गया है जो आपके सर्वर पर चल रहा है (टिप्पणियों के आधार पर, यह मामला नहीं हो सकता है), तो आप mysqlbinlogmysql-bin फ़ाइलों से सर्वर पर चलने वाले प्रत्येक SQL कथन को पुनर्प्राप्त करने के लिए भी उपयोग कर सकते हैं , और डेटाबेस को फिर से बनाना। Mysql-bin फ़ाइलों में यूनिक्स टाइमस्टैम्प होना चाहिए जो यह निर्धारित करने में आपकी सहायता करते हैं कि वे कितनी दूर जाते हैं।

यदि आपने अपनी मूल डेटाबेस फ़ाइलों को खो दिया है और आपके पास बची हुई सभी .ibd फाइलें हैं, तो आपको टिप्पणियों में akuzminsky के सुझावों के अनुसार डेटा को पुनर्प्राप्त करने का सहारा लेना पड़ सकता है।

MySQL 5.6 में InnoDB .ibd डेटा फ़ाइलों ( ट्रांसपोर्टेबल टेबलस्पेस ) को स्थानांतरित करने के लिए कुछ नई सुविधाएँ हैं , लेकिन इनमें कुछ प्रयास की आवश्यकता होती है और, पर्याप्त रूप से छोटे डेटाबेस के लिए, डेटा का उपयोग करके स्थानांतरण करना बहुत आसान होने वाला है mysqldump


0

विकी उत्तर akuzminsky द्वारा प्रश्न टिप्पणियों से उत्पन्न


यदि आप *.ibdफ़ाइलें देखते हैं , तो innodb_file_per_tableहै ON, अन्यथा सभी तालिकाओं में होगा ibdata1

यदि यह बताता है कि तालिका मौजूद नहीं है, तो तालिका InnoDB शब्दकोश में गायब है। सभी तालिकाओं को अलग-अलग sql dumps (एक तालिका - एक फ़ाइल) में डंप करने का प्रयास करें। उन तालिकाओं को आप डंप नहीं कर सकते हैं जिन्हें आप ट्विनबीडी रिकवरी टूलकिट के साथ पुनर्स्थापित कर सकते हैं ।

अभी तक कोई बाइनरी पैकेज नहीं हैं। आपको GitHub से सोर्स कोड प्राप्त करना होगा और उसे संकलित करना होगा। Recover InnoDB शब्दकोश में निर्देश देखें । यह बहुत सीधा है:

git clone git@github.com:twindb/undrop-for-innodb.git

और फिर

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