MySQL InnoDB टेबल्स खो गई लेकिन फाइलें मौजूद हैं


32

मेरे पास एक MySQL InnoDB है जिसमें सभी डेटाबेस टेबल फाइलें हैं, लेकिन MySQL उन्हें नहीं देखता है, और उन्हें लोड नहीं कर रहा है।

समस्या इसलिए हुआ क्योंकि मैं इन तीन फ़ाइलें हटा दी: ibdata1, ib_logfile0औरib_logfile1

क्योंकि मैं mysql के साथ समस्याएँ शुरू कर रहा था, और जो मैंने पढ़ा था वह उन्हें दूर करना था क्योंकि MySQL उन्हें फिर से तैयार कर देगा (मुझे पता है कि मुझे उनका समर्थन करना चाहिए था लेकिन नहीं किया था)।

तालिकाएँ फिर से देखने के लिए मैं MySQL प्राप्त करने के लिए क्या कर सकता हूँ?

about_member.frm                              site_stories.frm
about_member.ibd                              site_stories.ibd
db.opt                                        stories.frm
FTS_00000000000000bb_BEING_DELETED_CACHE.ibd  stories.ibd
FTS_00000000000000bb_BEING_DELETED.ibd        story_comments.frm
FTS_00000000000000bb_CONFIG.ibd               story_comments.ibd
FTS_00000000000000bb_DELETED_CACHE.ibd        story_likes.frm
FTS_00000000000000bb_DELETED.ibd              story_likes.ibd
FTS_00000000000000f5_BEING_DELETED_CACHE.ibd  story_tags.frm
FTS_00000000000000f5_BEING_DELETED.ibd        story_tags.ibd
FTS_00000000000000f5_CONFIG.ibd               story_views.frm
FTS_00000000000000f5_DELETED_CACHE.ibd        story_views.ibd
FTS_00000000000000f5_DELETED.ibd              story_view_totals.frm
member_favorites.frm                          story_view_totals.ibd
member_favorites.ibd                          tags.frm
members.frm                                   tags.ibd
members.ibd

क्या आपने उन फ़ाइलों को पुनर्स्थापित करने का प्रयास किया है? लॉग फ़ाइलों को हटाया जा सकता है। आपको वास्तव में ibdata1
Ramhound

मैंने फ़ाइल को पुराने mysql संस्करण से कॉपी किया है जहाँ फ़ाइल स्थित थी, लेकिन तालिकाओं में दिखाई नहीं देता है।
मेरे लॉन

जवाबों:


35

यही कारण है कि MySQL उन फ़ाइलों को नहीं देख सकता है: सिस्टम टेबलस्पेस (ibdata1) में एक स्टोरेज-इंजन विशिष्ट डेटा शब्दकोश है जो इनोबीडी को संभावित टेबल उपयोग को मैप करने देता है:

InnoDB वास्तुकला

एक स्थान से दूसरे स्थान पर इनोबीडी टेबल को ले जाने के लिए कमांड की आवश्यकता होती है

ALTER TABLE tblname DISCARD TABLESPACE;
ALTER TABLE tblname IMPORT TABLESPACE;

यहाँ MySQL 5.5 प्रलेखन का एक हिस्सा है जो यह बताता है कि क्या विचार करने की आवश्यकता है

.Ibd फ़ाइलों के लिए पोर्टेबिलिटी विचार

आप डेटाबेस निर्देशिकाओं के बीच स्वतंत्र रूप से .ibd फ़ाइलों को स्थानांतरित नहीं कर सकते हैं जैसा कि आप MyISAM तालिका फ़ाइलों के साथ कर सकते हैं। InnoDB साझा तालिकाओं में संग्रहीत तालिका परिभाषा में डेटाबेस का नाम शामिल है। तालिकाओं फ़ाइलों में संग्रहीत लेनदेन आईडी और लॉग अनुक्रम संख्या भी डेटाबेस के बीच भिन्न होती है।

एक .ibd फ़ाइल और संबंधित तालिका को एक डेटाबेस से दूसरे में ले जाने के लिए, RENAME TABLE स्टेटमेंट का उपयोग करें:

RENAME TABLE db1.tbl_name को db2.tbl_name; यदि आपके पास .ibd फ़ाइल का "क्लीन" बैकअप है, तो आप इसे उस MySQL इंस्टॉलेशन में पुनर्स्थापित कर सकते हैं जहाँ से यह उत्पन्न हुआ है:

आपके द्वारा .ibd फ़ाइल को कॉपी करने के बाद टेबल को गिराया या छोटा नहीं किया गया होगा, क्योंकि ऐसा करने से टेबलस्पेस के अंदर संग्रहीत टेबल आईडी बदल जाती है।

वर्तमान .ibd फ़ाइल को हटाने के लिए यह वैकल्पिक विवरण जारी करें:

अन्य तालिका tbl_name DISCARD TABLESPACE; बैकअप .ibd फ़ाइल को उचित डेटाबेस निर्देशिका में कॉपी करें।

तालिका के लिए नई .ibd फ़ाइल का उपयोग करने के लिए InnoDB को बताने के लिए यह वैकल्पिक विवरण जारी करें:

अन्य तालिका tbl_name आयात तालिकाएँ; इस संदर्भ में, "साफ" .ibd फ़ाइल बैकअप वह है जिसके लिए निम्नलिखित आवश्यकताएँ पूरी होती हैं:

.Ibd फ़ाइल में लेन-देन के द्वारा कोई भी अनधिकृत संशोधन नहीं हैं।

.Ibd फ़ाइल में कोई अनमर्ज़ सम्मिलित बफ़र प्रविष्टियाँ नहीं हैं।

Purge ने .ibd फ़ाइल से सभी डिलीट-मार्क इंडेक्स रिकॉर्ड्स को हटा दिया है।

mysqld ने .ibd फ़ाइल के सभी संशोधित पृष्ठों को बफर पूल से फ़ाइल में फ्लश कर दिया है।

इन गहनों और प्रोटोकॉल को देखते हुए, यहां कार्रवाई का एक सुझाया गया पाठ्यक्रम है

इस उदाहरण के लिए, आइए डेटाबेस में tagsतालिका को पुनर्स्थापित करने का प्रयास mydbकरें

चरण 1

सुनिश्चित करें कि आपके पास उन .frmऔर .ibdफ़ाइलों का बैकअप है/tmp/innodb_data

चरण 2

CREATE TABLE tagsबयान प्राप्त करें और इसे निष्पादित करें CREATE TABLE mydb.tags ...। सुनिश्चित करें कि यह मूल के समान सटीक संरचना हैtags.frm

चरण 3

tags.ibdMySQL का उपयोग करके रिक्त को हटाएं

ALTER TABLE mydb.tags DISCARD TABLESPACE;

चरण 4

की बैकअप कॉपी में लाएं tags.ibd

cd /var/lib/mysql/mydb
cp /tmp/innodb_data.tags.ibd .
chown mysql:mysql tags.ibd

STEP # 5

tagsInnoDB डेटा शब्दकोश में तालिका जोड़ें

ALTER TABLE mydb.tags IMPORT TABLESPACE;

चरण 6

तालिका की पहुंच का परीक्षण करें

SHOW CREATE TABLE mydb.tags\G
SELECT * FROM mydb.tags LIMIT 10;

यदि आपको सामान्य परिणाम मिलते हैं, तो बधाई हो कि आप एक InnoDB तालिका आयात करते हैं।

चरण 7

भविष्य में, कृपया ibdata1 और उसके लॉग को न हटाएं

कोशिश करो !!!

मैंने पहले भी इस तरह की चीजों पर चर्चा की है

चेतावनी

क्या होगा यदि आप तालिका की संरचना नहीं जानते हैं tags?

वहाँ सिर्फ .frmफ़ाइल का उपयोग कर सृजन टेबल विवरण प्राप्त करने के लिए उपकरण हैं । मैंने इस बारे में एक पोस्ट भी लिखी थी: टेबल स्कीमा को सिर्फ .frm फाइल से कैसे निकाला जा सकता है? । उस पोस्ट में, मैंने लिनक्स बॉक्स से विंडोज मशीन में एक .frm फाइल कॉपी की, विंडोज टूल चलाया और CREATE TABLEस्टेटमेंट प्राप्त किया।


भयानक उत्तर के लिए धन्यवाद! मैं अभी भी एक तालिका आयात करने की प्रक्रिया में हूं, क्योंकि मैं समस्याएं पैदा करता रहता हूं, लेकिन मैं अंततः वहां पहुंचूंगा, और मैं आपको बता दूंगा कि यह कैसे काम करता है! धन्यवाद!
मेरे लॉन

1
जब मैं बना लेतीweblyizetags हूं तो मुझे मिलता है: ERROR 1813 (HY000): टेबल के लिए टेबलपेप्स ' ' मौजूद। कृपया आयात से पहले टेबलस्पेस को खारिज कर दें। तो फिर मैं पहले परिवर्तन टेबल को चलाने की कोशिश करता हूं, और यह त्रुटि मिलती है: ERROR 1146 (42S02): तालिका 'weblyize.tags' मौजूद नहीं है । मैं क्या कर सकता हूँ?
मेरे लॉन

धन्यवाद! अपनी त्रुटि को ठीक करने के लिए मैंने एक नया डेटाबेस बनाया, CREATE TABLE ...फिर आपके चरणों का पालन किया! तुम मुझे खरोंच से उन्हें 100% फिर से लिखने से बचा लिया! इसने विदेशी चाबियों का आयात नहीं किया, लेकिन यह ठीक है कि मैं खुद ऐसा कर सकता हूं! फिर से धन्यवाद!
मेरे लॉन से दूर हो जाओ

क्या होगा अगर मेरे पास 100 टेबल हैं जिन्हें इस तरह से तय किया जाना चाहिए। मैं हाथों से प्रत्येक तालिका के लिए संचालन नहीं करूंगा। यह कैसे स्वचालित हो सकता है?
ओलेग अब्राजेव

10

मेरे पास एक ही स्थिति है, विशिष्ट tblname नहीं छोड़ या बना सकते हैं। मेरी तय प्रक्रिया है:

  1. MySQL बंद करो।

    service mysql stop
    
  2. Ib_logfile0 और ib_logfile1 निकालें।

    cd /var/lib/mysql;
    rm ib_logfile0 ib_logfile1
    
  3. Tblname फ़ाइलें निकालें। चेतावनी: यह आपके डेटा को पूरी तरह से हटा देगा

    cd /var/lib/mysql/dbname;
    rm tblname*
    
  4. MySQL शुरू करें।

    service mysql start
    

1
धन्यवाद यह मेरी समस्या तय हो गई, मैंने चरण 3 नहीं किया, मैंने बस लॉगफ़ाइल्स को हटा दिया और mysql को वापस शुरू किया।
जेफ विल्बर्ट

आप बिल्कुल शानदार हैं! मेरा मुद्दा हल किया।
एलेक्स जीपी

2

मुझे यह समस्या भी हुई। मैंने ibdata1गलती से डिलीट कर दिया और मेरा सारा डेटा खो गया।

Google और SO में 1-2 दिन की खोज के बाद, आखिरकार मुझे एक समाधान मिला कि इसने मेरे जीवन को बचाया (मेरे पास बहुत सारे डेटाबेस और विशाल रिकॉर्ड वाले टेबल थे)।

  1. से बैकअप लें /var/lib/mysql

  2. .frmफ़ाइल से तालिका स्कीमा को dbsake के साथ पुनर्प्राप्त करें (एक और विकल्प था! mysqlfrm । लेकिन यह मेरे लिए काम नहीं आया)

dbsake frmdump --type-codes /var/lib/mysql/database-name/tbl.frm
  1. निर्यात किए गए स्कीमा के साथ नई तालिका (नए नाम के साथ) बनाएं।

  2. इस आदेश के साथ नया टेबल डेटा त्यागें:

ALTER TABLE `tbl-new` DISCARD TABLESPACE;
  1. पुराने टेबल के डेटा को कॉपी करें और नए के बजाय पेस्ट करें और इसके लिए सही अनुमति निर्धारित करें।
cp tbl.ibd tbl@002dnew.ibd && chown mysql:mysql tbl@002dnew.ibd
  1. नई तालिका में डेटा आयात करें।
ALTER TABLE `tbl-new` IMPORT TABLESPACE;
  1. ठीक है! हमारे पास नई तालिका में डेटा है और हम पुराने को छोड़ सकते हैं।
DROP TABLE `tbl`;
  1. जाँच करें /var/lib/mysql/database-nameऔर यदि .ibdपुरानी तालिका के लिए डेटा ( फ़ाइल) है, तो उसे हटा दें।
rm tbl.ibd
  1. और अंत में मूल नाम पर नई तालिका का नाम बदलें
ALTER TABLE `tbl-new` RENAME `tbl`;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.