ध्यान दें
क्योंकि इस प्रक्रिया को करने के लिए फ़ायरफ़ॉक्स बंद होना चाहिए, इस पृष्ठ को किसी अन्य वेब ब्राउज़र में खोलना या आगे बढ़ने से पहले उसका प्रिंट आउट अवश्य लें।
स्थान डेटाबेस को पुनर्प्राप्त करने की कोशिश करने के घंटों के बाद, यहां तक कि फ़ायरफ़ॉक्स स्रोत कोड को पढ़ते हुए, मैं सफल रहा। यहाँ मैंने यह कैसे किया:
- SQLite शेल का नवीनतम संस्करण डाउनलोड करें और इसे अपने प्रोफ़ाइल फ़ोल्डर में निकालें। विंडोज विस्टा और विंडोज 7 पर, यह
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultफ़ोल्डर में है।
- अगर यह चल रहा है तो फ़ायरफ़ॉक्स को बंद करें।
- स्थान डेटाबेस
places.sqliteफ़ाइल में है। यदि फ़ाइल को भ्रष्टाचार के कारण बदल दिया गया था, तो places.sqlite.corruptपुनर्प्राप्ति के लिए फ़ाइल का उपयोग करें । नाम places.sqlite.bakया , फ़ाइल की एक बैकअप प्रतिलिपि बनाएँ places.sqlite.corrupt.bak।
- डेटाबेस फ़ाइल (
sqlite3 places.sqliteया sqlite3 places.sqlite.corrupt) खोलने के लिए SQLite शेल का उपयोग करें , फिर दर्ज करें:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
क्योंकि डेटाबेस दूषित है, जिसके परिणामस्वरूप डेटाबेस डंप पूर्ण नहीं है, और पुनर्प्राप्त करने योग्य डेटा के सभी पुनर्प्राप्त नहीं किए गए हैं। यह निर्धारित करने के लिए कि त्रुटि कहां हुई, ERRORडंप फ़ाइल के अंदर एक एसक्यूएल टिप्पणी में शब्द (सभी कैप) की खोज करें dump.sql(मैंने ऐसा करने के लिए नोटपैड ++ का उपयोग किया ), और INSERTप्रश्न में तालिका निर्धारित करने के लिए इसके ऊपर SQL कमांड पढ़ें । मेरे मामले में, क्षतिग्रस्त तालिका है moz_places। (स्थान डेटाबेस में पाए गए तालिकाओं का विवरण यहां पाया जा सकता है , जिसमें एक पुराना ईआर आरेख शामिल है।) मैं समझाता हूं कि इस तालिका से केवल अतिरिक्त डेटा कैसे पुनर्प्राप्त किया जाए; निम्नलिखित प्रक्रिया संभवतः अन्य तालिकाओं के लिए लागू नहीं होती है, इसलिए यदि कोई तालिका moz_placesशामिल है , तो इन उप-चरणों को छोड़ दें ।)
moz_placesतालिका में प्रत्येक पंक्ति में एक आईडी है। इस आईडी के आदेश के बाद तालिका से पंक्तियों को डंप किया जाता है। 1INSERT स्टेटमेंट में ओपनिंग कोष्ठक के बाद आईडी पहला मान है । वह क्षेत्र जहां डेटाबेस क्षतिग्रस्त है, इस तालिका में पंक्तियों का एक छोटा ब्लॉक होने की संभावना है; इस क्षतिग्रस्त क्षेत्र को छोड़ना और अधिक से अधिक डेटा को पुनर्प्राप्त करना है। इस तरह के ब्लॉक का प्रारंभ क्षेत्र डंप में दर्शाया गया है क्योंकि ERRORटिप्पणी दिखाई देने से पहले पंक्ति में है। इस पंक्ति के लिए आईडी का उपयोग करके, हम यह निर्धारित कर सकते हैं कि डेटाबेस कहाँ क्षतिग्रस्त है। हम SELECTएक शर्त के रूप में आईडी के साथ बयानों का उपयोग करके ऐसा करते हैं; इस प्रक्रिया में कुछ परीक्षण और त्रुटि होती है। उदाहरण के लिए, यदि त्रुटि से पहले अंतिम आईडी 49999 थी, और त्रुटि इस प्रकार है, तो क्षतिग्रस्त ब्लॉक आईडी 50000 पर शुरू होता है।
- अनावश्यक आउटपुट को दबाएं
- निम्न कमांड विंडोज सिस्टम के लिए है
- लिनक्स और अन्य यूनिक्स और यूनिक्स जैसी प्रणालियों के लिए, .output / dev / null का उपयोग करें
.आउटपुट एनयूएल
Moz_places से id id सेलेक्ट करें जहाँ => 50100;
- निम्नलिखित के मान को समायोजित करें
id >=और उपरोक्त SELECTकमांड को तब तक दोहराएं जब तक कि आप सबसे छोटा मान न पाएं जो SQLite को त्रुटि उत्पन्न करने का कारण नहीं बनाता है। यह वह आईडी है जो उस पंक्ति को संदर्भित करती है जिससे हम अतिरिक्त डेटा को पुनर्प्राप्त कर सकते हैं। मान लें कि यह आईडी 50200 है। इस डेटा को डंप करने के लिए, दर्ज करें:
.output dip2.sql
.मोड डालें
का चयन करें * moz_places से जहां आईडी> = 50200;
- सामान्य आउटपुट व्यवहार को पुनर्स्थापित करें
.आउटपुट
.Mode सूची
- ध्यान दें कि फ़ाइल
INSERTमें स्टेटमेंट्स के dump2.sqlसाथ शुरू होता है INSERT INTO table VALUES, इसलिए इस स्ट्रिंग के सभी इंस्टेंस को बदलने के लिए अपने टेक्स्ट एडिटर में फाइंड और रिप्लेस फीचर का उपयोग करें INSERT INTO moz_places VALUES।
dump2.sqlफ़ाइल की संपूर्ण सामग्री की प्रतिलिपि बनाएँ और उस फ़ाइल में पेस्ट करें dump.sqlजहाँ ERRORटिप्पणी दिखाई देती है।
ROLLBACK; -- due to errorsफ़ाइल के अंत में बदलें COMMIT;।
- निम्न कोड को
dump.sqlफ़ाइल के शीर्ष पर जोड़ें । <version>सही मान से बदलें , जो फ़ायरफ़ॉक्स के संस्करण के आधार पर डेटाबेस स्कीमा संस्करण को निर्धारित करने के लिए फ़ायरफ़ॉक्स के लिए आवश्यक है, निम्नानुसार है (यह फ़ायरफ़ॉक्स स्रोत फ़ाइल में पाया जा सकता है toolkit/components/places/Database.cpp):
- फ़ायरफ़ॉक्स 52: स्कीमा संस्करण 35
- फ़ायरफ़ॉक्स 53: स्कीमा संस्करण 36
- फ़ायरफ़ॉक्स 57: स्कीमा संस्करण 39
- फ़ायरफ़ॉक्स 58: स्कीमा संस्करण 41
- फ़ायरफ़ॉक्स 60: स्कीमा संस्करण 43
- फ़ायरफ़ॉक्स 61: स्कीमा संस्करण 47
- फ़ायरफ़ॉक्स 62: स्कीमा संस्करण 52
- फ़ायरफ़ॉक्स 69: स्कीमा संस्करण 53
PRAGMA user_version = <संस्करण>;
PRAGMA journal_mode = truncate;
PRAGMA page_size = 32768;
शून्य स्थान;
PRAGMA journal_mode = wal;
- SQLite शेल से बाहर निकलें, हटाएं
places.sqlite, फिर SQLite शेल places.sqliteका उपयोग करके एक खाली डेटाबेस बनाना शुरू करें sqlite3 places.sqlite। .read dump.sqlडेटाबेस में SQL डंप लोड करने के लिए टाइप करें।
- फ़ायरफ़ॉक्स शुरू करें और पुष्टि करें कि आपका इतिहास और स्थान बार इरादा के अनुसार काम कर रहे हैं। एक बार जब आपने पुष्टि कर ली है कि सब कुछ ठीक है, डेटाबेस डंप फ़ाइलों और प्रोफाइल फ़ोल्डर से SQLite शेल निष्पादन योग्य निकालें।
अधिक प्रासंगिक जानकारी निम्न पृष्ठों पर पाई जा सकती है:
इस एमडीएन लेख में एक सरलीकृत प्रक्रिया वर्णित है लेकिन मैंने इसका परीक्षण नहीं किया है। बहरहाल, मैंने PRAGMAउस लेख से अपडेटेड कमांड्स को शामिल किया है ।
1 SQL आमतौर पर गारंटी नहीं देता है कि डेटाबेस आउटपुट किसी भी क्रम में दिया जाएगा जब तक कि आप ORDER BYक्लॉज का उपयोग नहीं करते हैं । हालाँकि, ORDER BYकिसी दूषित डेटाबेस पर किसी भी आउटपुट का उत्पादन करने में विफल हो जाएगा (जैसा कि किसी भी आउटपुट का उत्पादन करने से पहले SQLite को पूरी तालिका को पढ़ने की आवश्यकता होगी)। जहां तक मुझे पता है, फ़ायरफ़ॉक्स हमेशा moz_placesअनुक्रमिक आईडी के साथ तालिका प्रविष्टियां लिखता है , इसलिए हम मान सकते हैं कि सभी आउटपुट आईडी द्वारा आदेशित हैं।