मैंने गलती से सभी तालिकाओं को गिरा दिया। क्या मैं वापस बहाल कर सकता हूं? मेरे पास बैकअप कॉपी नहीं है।
मैंने गलती से सभी तालिकाओं को गिरा दिया। क्या मैं वापस बहाल कर सकता हूं? मेरे पास बैकअप कॉपी नहीं है।
जवाबों:
यदि आपके पास शाब्दिक रूप से कोई बैकअप नहीं है, तो मुझे यकीन है कि आप भाग्य से बाहर हैं।
यदि आपके पास बैकअप का कोई भी रूप है, हालांकि पुराना है, तो क्या आपके पास लॉग-बिन विकल्प के माध्यम से बाइनरी लॉगिंग चालू है जो कि MySQL config file (my.ini) में है? यदि ऐसा है तो आप पिछले बैकअप के बाद से पुनर्प्राप्त करने में सक्षम हो सकते हैं।
एक सप्ताह शुरू करने के लिए बुरा तरीका है, क्षमा करें।
सवाल बल्कि पुराना है, लेकिन एक भी सकारात्मक जवाब नहीं है, इसलिए मैं एक जोड़ूंगा।
MySQL एक टेबल ड्रॉप करने के बाद कुछ समय के लिए मीडिया पर डेटा अभी भी है। तो आप रिकॉर्ड प्राप्त कर सकते हैं और एक टेबल का पुनर्निर्माण कर सकते हैं। बाद में मैं इसके बारे में ब्लॉग करूँगा, लेकिन अब त्वरित स्केच के लिए।
आपको अपनी तालिका की संरचना (क्रिएट टेबल स्टेटमेंट) की आवश्यकता होगी।
अगर innodb_file_per_table पर है, तो टेबल डिस्क विभाजन पर है। MySQL को रोकें और इसे केवल पढ़ने के लिए ASAP के रूप में माउंट करें। यदि MySQL रूट पार्टीशन पर था (जो कि अच्छा विचार btw नहीं है) तो एक इमेज लें या डिस्क को बाहर निकालें और दूसरे सर्वर में प्लग करें। दूसरे शब्दों में सब लिखना बंद करो।
अगर innodb_file_per_table बंद है तो बस MySQL बंद करो।
फिर https://github.com/twindb/undrop-for-innodn/ से InnoDB के लिए अन-ड्रॉप टूल डाउनलोड करें और संकलित करें । विवरण के लिए " संकलन ट्विनबीडी रिकवरी टूलकिट " पोस्ट की जांच करें।
तब स्ट्रीम विभाजन के साथ डिस्क विभाजन या ibdata1 (innodb_file_per_table सेटिंग के आधार पर) पार्स करें:
./stream_parser -f /path/to/diskimage_or_ibdata1
इसके बाद इनोबीडी डिक्शनरी को रिकवर करें, जिसमें यह पता चलता है कि इंडेक्स_डेड टेबल गिरा हुआ था।
फिर तालिका संरचना लें और रिकॉर्ड प्राप्त करें
./c_parser -f pages-diskimage_or_ibdata1/FIL_PAGE_INDEX/00000<index_id>.page
यह स्टडआउट और लोड डाटा कमांड को स्टादर को रिकॉर्ड करेगा।
यहाँ मैंने क्या किया है। Mysql निर्देशिका में (उबंटू के लिए यह / var / lib / mysql है, मैक के लिए Homebrew का उपयोग करके यह है / usr / स्थानीय / var / mysql), मुझे कुछ फाइलें मिलीं। पहले मैंने myapp_development / निर्देशिका की प्रतिलिपि बनाई जिसमें विशेष स्कीमा मेरे स्थानीय mysql निर्देशिका में थी। फिर मैंने अपने स्थानीय ibdata1 का बैकअप लिया और सर्वर के ibdata1 को mysql निर्देशिका में कॉपी किया। मार डाला मेरे मायके। ( ps aux
पीआईडी को खोजने के लिए, तब kill PID
)। Mysql को पुनरारंभ किया, यह क्रैश रिकवरी मोड में शुरू हुआ। फिर अपने स्थानीय mysql क्लाइंट को निकाल दिया और मुझे आवश्यक तालिकाओं का एक पूरा डंप उत्पन्न किया।
और, 15,000 पंक्तियों का प्रतिनिधित्व करते हुए काम के हफ्तों में मेटाडेटा में प्रवेश करना हमने सोचा कि हमेशा के लिए चले गए, बच गए !!
आशा है कि यह किसी की मदद करता है।
बहुत कम आप दुर्भाग्य से कर सकते हैं, एक अच्छी बैकअप योजना की आवश्यकता के बारे में बहुत मूल्यवान सबक लेने के अलावा।
तालिका प्रकार के आधार पर आप एक विशेषज्ञ को खोजने में सक्षम हो सकते हैं जो डेटा को एक साथ वापस कर सकता है जो इसे डिस्क पर छोड़ दिया है, लेकिन इस तरह के फोरेंसिक विश्लेषण बहुत महंगे होंगे (क्योंकि इसमें अपेक्षाकृत असामान्य कौशल की आवश्यकता होगी) और बिल्कुल गारंटी नहीं है वास्तव में उपयोगी होने के लिए।
यदि यह MyISAM तालिका थी, तो आपको बस / var / log / mysql या जो भी आपका डेटा dir है, टेबल फ़ाइलों को हटाना चाहिए। आप उदाहरण के लिए इसके लिए ext3grep उपयोगिता का उपयोग कर सकते हैं ।
आप "पूर्ववत्" नहीं कर सकते DROP TABLE
।
आप देख सकते हैं और देख सकते हैं कि MySQL में बाइनरी लॉगिंग सक्षम थी, हो सकता है कि आप वहां से कुछ डेटा निकाल सकें।
इसके अलावा, आप MySQL के बारे में भूल सकते हैं और "मैं गलती से अपने फाइल सिस्टम से कुछ फ़ाइलों को हटा दिया" जैसी समस्याओं का एक ही वर्ग में हैं। वहाँ कुछ उपकरण हैं जो फ़ाइलों को पुनर्प्राप्त करने का प्रयास करते हैं, और ऐसी कंपनियां भी हैं जो पेशेवर आधार पर ऐसा करती हैं।
यदि आपके पास बाइनरी लॉगिंग चालू है, तो आप स्कीमा होने पर पहले एक तालिका को फिर से बना सकते हैं। सुनिश्चित करें कि जब आप द्विपद बंद कर देते हैं तो आप स्कीमा बनाते हैं। या आप सिर्फ सत्र के लिए छोड़ सकते हैं। फिर आप अंतिम कथन तक बिनलॉग्स को फिर से दोहरा सकते हैं जो ड्रॉप टेबल ही था।
यदि नहीं तो आप बैकअप डंप का उपयोग करके पुनर्स्थापित कर सकते हैं यदि आपके पास कोई है। यदि आपके पास सीएसवी फाइलें हैं तो आप डेटा को पुनर्प्राप्त करने के लिए डेटा इनफ़िल विधि को लोड कर सकते हैं। यदि आप mysqldump से पुनर्प्राप्त कर रहे हैं, तो आप पूर्ण डेटाबेस को पुनर्स्थापित करने के बजाय डंप फ़ाइल से एकल तालिका को पुनर्स्थापित करने पर विचार कर सकते हैं। यदि डेटा का आकार बहुत बड़ा है तो आप लोड करने से पहले चाबियों को निष्क्रिय करने पर विचार कर सकते हैं, इससे पुनर्स्थापना प्रक्रिया में काफी वृद्धि होगी।
भविष्य के लिए आप एक विलंबित दास की तरह हो सकते हैं जैसे 10-24 घंटे पीछे। आप पेरकोना टूलकिट (pt-slave-delay) का उपयोग करके विलंबित दास बना सकते हैं