Bagaimana cara memperbaiki basis data Firefox places.sqlite yang rusak?

15

Saya punya beberapa masalah dengan RAM saya (bluescreen beberapa kali, Windows XP) dan sekarang database Firefox saya rusak. Firefox berfungsi, tetapi riwayat saya tidak ada dan melaporkan beberapa inkonsistensi dan kesalahan saat dijalankan pragma integrity_checkpada places.sqlite:

citra disk basis data salah

Sekarang pertanyaannya, bagaimana cara saya memperbaiki Database-SQLite?

Polisi
sumber
2
Untuk referensi di masa mendatang, FEBE (Ekstensi Cadangan Lingkungan Firefox) dapat membantu di masa mendatang. Menyalin seluruh profil, dan mengemasnya sebagai satu cadangan. Saya tahu itu tidak menjawab pertanyaan Anda, tetapi mungkin membantu untuk mengetahui di masa depan. bit.ly/aumThw
Urda
Diedit untuk membantu Googler menemukan pertanyaan ini.
bwDraco

Jawaban:

22

Catatan

Karena Firefox harus ditutup untuk melakukan prosedur ini, pastikan untuk membuka halaman ini di browser web lain atau cetak sebelum melanjutkan.


Setelah berjam-jam bekerja berusaha memulihkan basis data Places, bahkan membaca kode sumber Firefox, saya sudah berhasil. Begini cara saya melakukannya:

  • Unduh versi terbaru dari shell SQLite dan ekstrak ke folder profil Anda. Pada Windows Vista dan Windows 7, ada di C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultfolder.
  • Tutup Firefox jika sedang berjalan.
  • Database Places ada di places.sqlitefile. Jika file diganti karena korupsi, gunakan places.sqlite.corruptfile untuk pemulihan. Buat salinan cadangan file, bernama places.sqlite.bakatau places.sqlite.corrupt.bak.
  • Gunakan shell SQLite untuk membuka file database ( sqlite3 places.sqliteatau sqlite3 places.sqlite.corrupt), lalu masukkan:
.output dump.sql    -- sends output to file dump.sql
.dump               -- dumps database to file
  • Karena database rusak, dump database yang dihasilkan tidak lengkap, dan tidak semua data yang dapat dipulihkan telah diambil. Untuk menentukan di mana kesalahan terjadi, cari kata ERROR(semua huruf besar) dalam komentar SQL di dalam file dump dump.sql(saya menggunakan Notepad ++ untuk melakukan ini), dan baca INSERTperintah SQL di atasnya untuk menentukan tabel yang dimaksud. Dalam kasus saya, tabel yang rusak adalah moz_places. (Deskripsi tabel yang ditemukan di database Places dapat ditemukan di sini , yang mencakup diagram ER yang sudah usang.) Saya akan menjelaskan cara memulihkan data tambahan dari tabel ini saja; prosedur berikut ini mungkin tidak berlaku untuk tabel lainnya, jadi lewati sub-langkah ini jika tabel selain moz_placesterlibat.)

    • Setiap baris dalam moz_placestabel memiliki ID. Baris dibuang dari tabel mengikuti urutan ID ini. 1 ID adalah nilai pertama setelah tanda kurung pembukaan dalam INSERTpernyataan. Area di mana database rusak kemungkinan merupakan blok kecil baris dalam tabel ini; ide di sini adalah untuk melewati area yang rusak ini dan memulihkan data sebanyak mungkin. Area awal dari blok tersebut diwakili dalam dump sebagai baris sebelum ERRORkomentar muncul. Dengan menggunakan ID untuk baris ini, kita dapat menentukan di mana basis data rusak. Kami melakukannya dengan menggunakan SELECTpernyataan dengan ID sebagai syarat; proses ini membutuhkan beberapa trial and error. Misalnya, jika ID terakhir sebelum kesalahan adalah 49999, dan kesalahan berikut, blok yang rusak dimulai pada ID 50000. Gunakan pernyataan seperti:

    - menekan output yang tidak perlu
    - perintah berikut adalah untuk sistem Windows
    - untuk Linux dan sistem mirip Unix dan Unix lainnya, gunakan .output / dev / null
    .output NUL
    
    SELECT id FROM moz_places WHERE id> = 50100;
    
    • Sesuaikan nilai mengikuti id >=dan ulangi SELECTperintah di atas sampai Anda menemukan nilai terkecil yang tidak menyebabkan SQLite menghasilkan kesalahan. Ini adalah ID yang merujuk pada baris mulai dari mana kita dapat memulihkan data tambahan. Anggap ID ini adalah 50200. Untuk membuang data ini, masukkan:

    .output dump2.sql
    .mode menyisipkan
    SELECT * FROM moz_places WHERE id> = 50200;
    
    - mengembalikan perilaku output normal
    .output stdout
    daftar .mode
    
    • Perhatikan bahwa INSERTpernyataan dalam dump2.sqlfile dimulai dengan INSERT INTO table VALUES, jadi gunakan fitur temukan dan ganti di editor teks Anda untuk mengganti semua instance dari string ini dengan INSERT INTO moz_places VALUES.
    • Salin seluruh isi dump2.sqlfile dan tempel ke dump.sqlfile tempat ERRORkomentar muncul.
  • Ganti ROLLBACK; -- due to errorsdi akhir file dengan COMMIT;.
  • Tambahkan kode berikut ke bagian atas dump.sqlfile. Ganti <version>dengan nilai yang benar, yang diperlukan untuk Firefox untuk menentukan versi skema database berdasarkan versi Firefox, sebagai berikut (ini dapat ditemukan di file sumber Firefox toolkit/components/places/Database.cpp):
    • Firefox 52: skema versi 35
    • Firefox 53: skema versi 36
    • Firefox 57: skema versi 39
    • Firefox 58: skema versi 41
    • Firefox 60: skema versi 43
    • Firefox 61: skema versi 47
    • Firefox 62: skema versi 52
    • Firefox 69: skema versi 53

PRAGMA user_version = <version>;
PRAGMA journal_mode = truncate;
PRAGMA page_size = 32768;
KEKOSONGAN;
PRAGMA journal_mode = wal;
  • Keluar dari shell SQLite, hapus places.sqlite, lalu mulai shell SQLite membuat places.sqlitedatabase kosong menggunakan sqlite3 places.sqlite. Ketik .read dump.sqluntuk memuat dump SQL ke dalam database.
  • Mulai Firefox dan konfirmasikan bahwa riwayat dan bilah lokasi Anda berfungsi sebagaimana dimaksud. Setelah Anda mengkonfirmasi bahwa semuanya OK, hapus file dump basis data dan SQLite shell yang dapat dieksekusi dari folder profil.

Informasi lebih relevan dapat ditemukan di halaman-halaman berikut:

Prosedur yang disederhanakan dijelaskan dalam artikel MDN ini tetapi saya belum mengujinya. Meskipun demikian, saya telah memasukkan PRAGMAperintah yang diperbarui dari artikel itu.


1 SQL biasanya tidak menjamin bahwa output basis data akan diberikan dalam urutan apa pun kecuali Anda menggunakan ORDER BYklausa. Namun, ORDER BYkemungkinan akan gagal menghasilkan output apa pun pada basis data yang rusak (karena SQLite perlu membaca seluruh tabel sebelum dapat menghasilkan output apa pun). Sejauh yang saya tahu, Firefox selalu menulis moz_placesentri tabel dengan ID berurutan, sehingga kita dapat mengasumsikan bahwa semua output dipesan oleh ID.

bwDraco
sumber
3
Ini adalah keangkeran murni. Membantu saya memulihkan hampir semua riwayat dari tempat yang korup. Sqlite. Terima kasih banyak!!
Ashutosh Jindal
Itu memang membantu, dengan dua modifikasi: 1) tambahkan ";" di baris user_version; 2) karena suatu alasan, file "korup" saya memiliki versi skema yang "satu kurang" dari yang diharapkan. Setelah metode Anda tidak berhasil pada awalnya, saya mencoba mengimpor dump ke database baru 10MB dan gagal karena tabel lama memiliki satu kolom lebih sedikit. Melihat tautan kode sumber membuat saya mengerti apa yang sedang terjadi. Pos yang luar biasa !!!
Tilman Hausherr
@ TilmanHausherr: Ditujukan. Untuk menghindari masalah perubahan kolom, pastikan untuk mengikuti langkah-langkah dalam jawaban ini segera setelah Anda melihat korupsi dan sebelum memperbarui Firefox, sehingga skema basis data tidak berubah. Anda juga dapat mencoba mengatur versi skema yang lebih lama — Firefox akan memperbaruinya ke versi baru ketika Anda memulihkan database.
bwDraco
Menyetel versi skema sebelumnya adalah apa yang telah saya lakukan ketika menulis komentar pertama saya, yaitu saya sudah berhasil :-) Ya, saya curiga bahwa saya tidak melihat korupsi segera, saya biasanya memperhatikan hanya ketika memasukkan karakter yang seharusnya membuat "URL lama" muncul dan tidak ada yang terjadi.
Tilman Hausherr
Kerja bagus! Senang Anda memperbaruinya, yang mengembalikannya ke pertanyaan aktif tempat saya melihatnya.
fixer1234
4

Yah, tergantung pada seberapa rusak itu, perbaikan mungkin tidak mungkin dilakukan. Taruhan terbaik Anda mungkin untuk mencoba dan membuang db menggunakan sqlite, kemudian lihat apa yang dapat Anda selamatkan.

Jika gagal, Anda mungkin harus memulihkan dari cadangan.

Untuk membuang dan membuat ulang basis data, gunakan perintah .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite
sleske
sumber
1
Terima kasih. Pos SO tidak membantu karena tidak berfungsi, tetapi solusi yang dirujuk di tautan berhasil d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Semua favicons sekarang hilang, tetapi saya mereka membangun kembali ketika saya mengunjungi situs. Terima kasih lagi!
Bobby
stackoverflow.com/questions/2255305/… tautan dalam pertanyaan di atas, dihapus secara sukarela oleh penulisnya. Jawaban di bawah ini mungkin bisa membantu.
user66001
@ user66001: Ya, OP menghapus pertanyaan mereka. Saya menyalin perintah yang relevan.
sleske
Ini tidak berhasil untuk saya, dan saya berakhir dengan sebuah places.sqlite.corruptfile. Saya mengirim jawaban lain dengan solusi yang bekerja untuk saya.
Daniel
2

Seperti biasa dengan melakukan perbaikan seperti ini, saya sarankan Anda terlebih dahulu membuat setidaknya satu salinan cadangan file places.sqlite Anda yang terletak di direktori profil Anda. Memiliki cadangan memungkinkan Anda untuk mencoba berbagai hal berbeda untuk memperbaiki masalah seperti itu sambil mengetahui bahwa jika upaya perbaikan memperburuk keadaan, Anda selalu dapat membuat salinan cadangan yang akan digunakan untuk mencoba lagi.

Bergantung pada apa yang rusak dan seberapa parah korupnya, dimungkinkan untuk memperbaiki masalah dengan ekstensi Tempat Pemeliharaan . Saya berakhir dengan file places.sqlite yang rusak pada beberapa kesempatan. Places Maintenance telah mampu memperbaiki masalah setiap kali dengan menjalankan berbagai pemeriksaan / perbaikan yang disediakannya sebagai operasi dalam dialog opsinya. Berbagai pemeriksaan dan / atau pelaporan yang berbeda hanya perlu beberapa menit hingga beberapa menit.

Jika ini tidak berhasil, maka lanjutkan dengan cara memperbaikinya secara manual dengan cara yang mirip dengan yang dijelaskan DragonLord di atas mungkin apa yang dibutuhkan.

Makyen
sumber
1

Proses ini dijelaskan pada MDN membantu saya menyelesaikan masalah di mana halaman baru yang saya kunjungi tidak direkam dalam riwayat browser. Saya tidak memiliki file places.sqlite.corrupt(atau places.sqlite-corrupt), tetapi memeriksa integritas places.sqlitefile saya mengungkapkan gambar disk basis data kesalahan.

Keluar dari Firefox dan buat cadangan profil Firefox Anda sebelum melangkah lebih jauh di sini.

$ 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

Mulai Firefox. Sejarah harus bekerja lagi.

Saya menggunakan Mac dengan Firefox 60.0.1. Anda mungkin perlu menyesuaikan perintah untuk platform Anda.

Daniel
sumber
Terima kasih Daniel, selalu membantu untuk melihat prosedur perintah yang sebenarnya
not2qubit