บันทึก
เนื่องจากต้องปิด Firefox เพื่อทำตามขั้นตอนนี้โปรดเปิดหน้านี้ในเว็บเบราว์เซอร์อื่นหรือพิมพ์ออกมาก่อนดำเนินการต่อ
หลังจากชั่วโมงการทำงานพยายามกู้คืนฐานข้อมูล Places แม้จะอ่านซอร์สโค้ด Firefox ฉันก็สามารถประสบความสำเร็จได้ นี่คือวิธีที่ฉันทำ:
- ดาวน์โหลดเวอร์ชันล่าสุดของ SQLite shellและแยกลงในโฟลเดอร์โปรไฟล์ของคุณ บน Windows Vista และ Windows 7 จะอยู่ใน
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
โฟลเดอร์
- ปิด Firefox หากทำงานอยู่
- ฐานข้อมูลสถานที่อยู่ใน
places.sqlite
ไฟล์ หากไฟล์ถูกแทนที่เนื่องจากความเสียหายให้ใช้places.sqlite.corrupt
ไฟล์สำหรับการกู้คืน สร้างสำเนาสำรองของแฟ้มชื่อหรือplaces.sqlite.bak
places.sqlite.corrupt.bak
- ใช้เชลล์ SQLite เพื่อเปิดไฟล์ฐานข้อมูล (
sqlite3 places.sqlite
หรือsqlite3 places.sqlite.corrupt
) จากนั้นป้อน:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
เนื่องจากฐานข้อมูลเสียหายการถ่ายโอนข้อมูลฐานข้อมูลที่ได้จึงไม่สมบูรณ์และไม่สามารถกู้คืนข้อมูลที่กู้คืนได้ทั้งหมด หากต้องการทราบว่าเกิดข้อผิดพลาดขึ้นให้ค้นหาคำERROR
(ตัวพิมพ์ใหญ่ทั้งหมด) ในความคิดเห็น SQL ภายในไฟล์ดัมพ์dump.sql
(ฉันใช้Notepad ++เพื่อทำสิ่งนี้) และอ่านINSERT
คำสั่งSQL ด้านบนเพื่อกำหนดตารางที่เป็นปัญหา moz_places
ในกรณีของตารางที่เสียหายคือ (คำอธิบายของตารางที่พบในฐานข้อมูลสถานที่สามารถพบได้ที่นี่ซึ่งรวมถึงแผนภาพ ER ที่ล้าสมัย) ฉันจะอธิบายวิธีการกู้คืนข้อมูลเพิ่มเติมจากตารางนี้เท่านั้น โพรซีเดอร์ต่อไปนี้อาจไม่สามารถใช้ได้กับตารางอื่นดังนั้นให้ข้ามขั้นตอนย่อยเหล่านี้หากมีตารางอื่นนอกเหนือจากที่moz_places
เกี่ยวข้อง)
- แต่ละแถวใน
moz_places
ตารางมี ID แถวจะถูกดัมพ์จากตารางตามลำดับ ID นี้ 1 ID คือค่าแรกหลังวงเล็บเปิดในINSERT
คำสั่ง พื้นที่ที่ฐานข้อมูลเสียหายน่าจะเป็นบล็อกแถวเล็ก ๆ ในตารางนี้ แนวคิดที่นี่คือการข้ามพื้นที่ที่เสียหายและกู้คืนข้อมูลให้ได้มากที่สุด พื้นที่เริ่มต้นของบล็อกดังกล่าวจะถูกแสดงในการถ่ายโอนข้อมูลเป็นแถวก่อนที่ERROR
ความคิดเห็นจะปรากฏขึ้น การใช้ ID สำหรับแถวนี้เราสามารถกำหนดได้ว่าฐานข้อมูลเสียหายที่ไหน เราทำได้โดยใช้SELECT
ข้อความสั่งที่มี ID เป็นเงื่อนไข กระบวนการนี้ใช้เวลาในการทดลองและข้อผิดพลาด ตัวอย่างเช่นหาก ID สุดท้ายก่อนที่ข้อผิดพลาดคือ 49999 และข้อผิดพลาดตามมาบล็อกที่เสียหายจะเริ่มต้นที่ ID 50000 ใช้คำสั่งเช่น:
- ระงับเอาต์พุตที่ไม่จำเป็น
- คำสั่งต่อไปนี้สำหรับระบบ Windows
- สำหรับ Linux และระบบที่คล้าย Unix และ Unix อื่น ๆ ให้ใช้ .put / dev / null
.output NUL
เลือก id จาก moz_places WHERE id> = 50100;
- ปรับค่าตามหลัง
id >=
และทำซ้ำSELECT
คำสั่งด้านบนจนกว่าคุณจะพบค่าน้อยที่สุดที่ไม่ทำให้ SQLite แสดงผลข้อผิดพลาด นี่คือ ID ที่อ้างถึงแถวที่เราสามารถกู้คืนข้อมูลเพิ่มเติมได้ สมมติว่า ID นี้คือ 50200 ในการดัมพ์ข้อมูลนี้ให้ป้อน:
.output dump2.sql
.mode แทรก
SELECT * จาก moz_places WHERE id> = 50200;
- เรียกคืนพฤติกรรมการส่งออกปกติ
.output stdout
.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>
ด้วยค่าที่ถูกต้องซึ่งเป็นสิ่งจำเป็นสำหรับ Firefox เพื่อกำหนดเวอร์ชันสกีมาฐานข้อมูลตามเวอร์ชันของ Firefox ดังนี้ (สามารถพบได้ในไฟล์ต้นฉบับของ Firefox toolkit/components/places/Database.cpp
):
- Firefox 52: schema เวอร์ชั่น 35
- Firefox 53: schema เวอร์ชั่น 36
- Firefox 57: สกีมาเวอร์ชัน 39
- Firefox 58: schema เวอร์ชัน 41
- Firefox 60: schema เวอร์ชั่น 43
- Firefox 61: schema เวอร์ชั่น 47
- Firefox 62: schema รุ่น 52
- Firefox 69: schema เวอร์ชั่น 53
PRAGMA user_version = <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 dump ลงในฐานข้อมูล
- เริ่ม Firefox และยืนยันว่าประวัติและแถบตำแหน่งของคุณทำงานได้ตามที่ต้องการ เมื่อคุณยืนยันว่าทุกอย่างเรียบร้อยแล้วให้ลบไฟล์ดัมพ์ฐานข้อมูลและเชลล์ SQLite ที่สามารถเรียกทำงานได้จากโฟลเดอร์โปรไฟล์
ข้อมูลที่เกี่ยวข้องเพิ่มเติมสามารถพบได้ในหน้าต่อไปนี้:
ขั้นตอนง่ายอธิบายไว้ในบทความ MDN นี้แต่ฉันยังไม่ได้ทดสอบ อย่างไรก็ตามฉันได้รวมPRAGMA
คำสั่งที่อัปเดตจากบทความนั้นแล้ว
1โดยปกติ SQL จะไม่รับประกันว่าจะให้เอาต์พุตฐานข้อมูลในลำดับใด ๆ เว้นแต่ว่าคุณจะใช้ORDER BY
คำสั่งย่อย อย่างไรก็ตามORDER BY
มีแนวโน้มที่จะล้มเหลวในการสร้างเอาต์พุตใด ๆ บนฐานข้อมูลที่เสียหาย (เนื่องจาก SQLite จะต้องอ่านตารางทั้งหมดก่อนที่จะสามารถสร้างเอาต์พุตใด ๆ ) เท่าที่ฉันรู้ Firefox จะเขียนmoz_places
รายการตารางที่มี ID ตามลำดับเสมอดังนั้นเราจึงสามารถสันนิษฐานได้ว่าเอาท์พุททั้งหมดเรียงลำดับตาม ID