मैं एक दूषित फ़ायरफ़ॉक्स स्थानों की मरम्मत कैसे करूँ।


15

मुझे अपनी रैम (ब्लूस्क्रीन कई बार, विंडोज़ एक्सपी) में कुछ समस्याएं थीं और अब मेरे फ़ायरफ़ॉक्स डेटाबेस क्षतिग्रस्त हो गए हैं। फ़ायरफ़ॉक्स काम कर रहा है, लेकिन मेरा इतिहास चला गया है और इसे निष्पादित करते समय कई विसंगतियों और त्रुटियों की रिपोर्ट कर pragma integrity_checkरहा है places.sqlite:

डेटाबेस डिस्क छवि विकृत है

अब सवाल है, मैं SQLite- डेटाबेस की मरम्मत कैसे करूं?


2
भविष्य के संदर्भ के लिए, FEBE (फ़ायरफ़ॉक्स पर्यावरण बैकअप एक्सटेंशन) भविष्य में सहायक हो सकता है। संपूर्ण प्रोफ़ाइल की प्रतिलिपि बनाता है, और इसे एकल बैकअप के रूप में पैकेज करता है। मुझे पता है कि यह आपके सवाल का जवाब नहीं देता है, लेकिन भविष्य में यह जानना उपयोगी हो सकता है। bit.ly/aumThw
उरदा

गोगलर्स को इस सवाल का पता लगाने में मदद करने के लिए संपादित किया गया।
bwDraco

जवाबों:


22

ध्यान दें

क्योंकि इस प्रक्रिया को करने के लिए फ़ायरफ़ॉक्स बंद होना चाहिए, इस पृष्ठ को किसी अन्य वेब ब्राउज़र में खोलना या आगे बढ़ने से पहले उसका प्रिंट आउट अवश्य लें।


स्थान डेटाबेस को पुनर्प्राप्त करने की कोशिश करने के घंटों के बाद, यहां तक ​​कि फ़ायरफ़ॉक्स स्रोत कोड को पढ़ते हुए, मैं सफल रहा। यहाँ मैंने यह कैसे किया:

  • 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अनुक्रमिक आईडी के साथ तालिका प्रविष्टियां लिखता है , इसलिए हम मान सकते हैं कि सभी आउटपुट आईडी द्वारा आदेशित हैं।


3
यह शुद्ध अशुभ है। एक भ्रष्ट स्थानों से लगभग सभी इतिहास को पुनर्प्राप्त करने में मेरी मदद की। एसक्लाइट। बहुत बहुत धन्यवाद!!
आशुतोष जिंदल

इसने मदद की, दो संशोधनों के साथ: 1) एक "जोड़ें;" user_version लाइन में; 2) किसी कारण से, मेरी "भ्रष्ट" फ़ाइल में एक स्कीमा संस्करण था जो अपेक्षा से "एक कम" था। आपकी विधि शुरू में काम नहीं करने के बाद, मैंने 10MB नए डेटाबेस में डंप आयात करने की कोशिश की और विफल हो गया क्योंकि पुरानी तालिका में एक कॉलम कम था। स्रोत कोड लिंक पर एक नज़र ने मुझे समझा कि क्या चल रहा था। बहुत बढ़िया पोस्ट!!!
तिलमन होशेर

@ टिलमैनहॉशर: एडेड। स्तंभ परिवर्तन समस्या से बचने के लिए, इस उत्तर में दिए गए चरणों का पालन करना सुनिश्चित करें जैसे ही आप भ्रष्टाचार को देखते हैं और फ़ायरफ़ॉक्स को अपडेट करने से पहले, ताकि डेटाबेस स्कीमा परिवर्तित न हो। आप पुराने स्कीमा संस्करण को सेट करने का भी प्रयास कर सकते हैं - जब आप डेटाबेस को पुनर्स्थापित करते हैं तो फ़ायरफ़ॉक्स इसे नए संस्करण में अपडेट कर देगा।
bwDraco

पिछले स्कीमा संस्करण को सेट करना, वही है जो मैंने अपनी पहली टिप्पणी लिखने के दौरान किया था, यानी मैं पहले से ही सफल था :-) हाँ, मुझे संदेह है कि मैंने तुरंत भ्रष्टाचार पर ध्यान नहीं दिया था, मैं आमतौर पर इसे केवल पात्रों को दर्ज करते समय नोटिस करता हूँ जो एक सूत्र बनाना चाहिए "पुराना URL" दिखाई देता है और कुछ भी नहीं होता है।
तिलमन होउशर

उत्कृष्ट कार्य! खुशी है कि आपने इसे अपडेट किया, जिसने इसे सक्रिय प्रश्नों में वापस रखा जहां मैंने इसे देखा।
फिक्सर 1234

4

खैर, यह कितना क्षतिग्रस्त है, इसके आधार पर, मरम्मत संभव नहीं हो सकती है। आपका सबसे अच्छा दांव संभवतः db का उपयोग करने की कोशिश करना और डंप करना है sqlite, फिर देखें कि आप क्या उबार सकते हैं।

यदि वह विफल रहता है, तो आपको संभवतः बैकअप से पुनर्स्थापित करना होगा।

डेटाबेस को डंप और रीक्रिएट करने के लिए, कमांड का उपयोग करें .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite

1
धन्यवाद। एसओ पद उपयोगी नहीं था क्योंकि यह काम नहीं करता था, लेकिन लिंक में संदर्भित समाधान ने काम किया d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db। सभी फ़ेविकॉन अब चले गए हैं, लेकिन मैं उन साइटों को देखने के लिए पुनर्निर्माण कर रहा हूं। एक बार फिर धन्यवाद!
बॉबी

stackoverflow.com/questions/2255305/… उपरोक्त प्रश्न में लिंक, स्वेच्छा से लेखक द्वारा हटा दिया गया था। नीचे दिए गए जवाब से मदद मिल सकती है।
user66001

@ user66001: हां, ओपी ने अपना प्रश्न हटा दिया। मैंने संबंधित कमांड पर कॉपी की।
साल्के

यह मेरे लिए काम नहीं किया, और मैं एक places.sqlite.corruptफ़ाइल के साथ समाप्त हुआ । मैंने एक समाधान के साथ एक और उत्तर पोस्ट किया जो मेरे लिए काम किया।
डैनियल

2

हमेशा की तरह इस तरह की मरम्मत करने के साथ, मैं सुझाव देता हूं कि आप पहले अपने प्रोफाइल निर्देशिका में स्थित अपने स्थानों की कम से कम एक बैकअप प्रतिलिपि बनाएँ। बैकअप होने से आप इस तरह की समस्याओं को सुधारने के लिए विभिन्न विभिन्न चीजों की कोशिश कर सकते हैं, जबकि यह जानते हुए कि यदि मरम्मत की गई चीजें खराब हो जाती हैं, तो आप हमेशा बैकअप की एक और प्रतिलिपि बना सकते हैं जिस पर फिर से प्रयास करें।

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

अगर यह काम नहीं करता है, तो मैन्युअल रूप से इसे ठीक करने के मार्ग पर जाने के समान है जो ड्रैगनलार्ड ऊपर वर्णित है कि क्या जरूरत है।


1

एमडीएन पर वर्णित इस प्रक्रिया ने मुझे एक समस्या को हल करने में मदद की जहां मेरे द्वारा देखे गए नए पृष्ठ ब्राउज़र इतिहास में दर्ज नहीं किए गए थे। मेरे पास एक places.sqlite.corrupt(या places.sqlite-corrupt) फ़ाइल नहीं थी, लेकिन मेरी places.sqliteफ़ाइल की अखंडता की जाँच करने से पता चला कि डेटाबेस डिस्क छवि विकृत त्रुटि है।

फ़ायरफ़ॉक्स से बाहर निकलें और अपने फ़ायरफ़ॉक्स प्रोफ़ाइल का एक बैकअप बनाने से पहले आप यहाँ किसी भी आगे बढ़ें।

$ cd /Users/<username>/Library/Application\ Support/Firefox/Profiles/<profile_dir>/
$ cp places.sqlite places.sqlite.bak  # for safety

$ sqlite3 places.sqlite
sqlite> PRAGMA integrity_check;
*** in database main ***
On tree page 2 cell 131: Rowid 20884 out of order
...
Error: database disk image is malformed
sqlite> .clone places-clone.sqlite
moz_places... done
moz_historyvisits... done
... more output like above plus a few errors (which I ignored) like
sqlite_sequence... Error: object name reserved for internal use: sqlite_sequence
SQL: [CREATE TABLE sqlite_sequence(name,seq)]
done
...
sqlite> PRAGMA user_version;
43  <----- TAKE NOTE OF THIS VALUE it may be different for you
sqlite> .exit

$ sqlite3 places-clone.sqlite
sqlite> PRAGMA integrity_check;
ok
sqlite> PRAGMA user_version = 43;  -- use the number you got from PRAGMA user_version; above
sqlite> PRAGMA journal_mode = truncate;
truncate
sqlite> PRAGMA page_size = 32768;
sqlite> VACUUM;
sqlite> PRAGMA journal_mode = wal;
wal
sqlite> .exit

$ mv places-clone.sqlite places.sqlite

फ़ायरफ़ॉक्स शुरू करो। इतिहास को फिर से काम करना चाहिए।

मैं फ़ायरफ़ॉक्स 60.0.1 के साथ एक मैक पर हूँ। आपको अपने प्लेटफ़ॉर्म के लिए कमांड को समायोजित करने की आवश्यकता हो सकती है।


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