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>.default
folder.
- Tutup Firefox jika sedang berjalan.
- Database Places ada di
places.sqlite
file. Jika file diganti karena korupsi, gunakan places.sqlite.corrupt
file untuk pemulihan. Buat salinan cadangan file, bernama places.sqlite.bak
atau places.sqlite.corrupt.bak
.
- Gunakan shell SQLite untuk membuka file database (
sqlite3 places.sqlite
atau 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 INSERT
perintah 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_places
terlibat.)
- Setiap baris dalam
moz_places
tabel memiliki ID. Baris dibuang dari tabel mengikuti urutan ID ini. 1 ID adalah nilai pertama setelah tanda kurung pembukaan dalam INSERT
pernyataan. 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 ERROR
komentar muncul. Dengan menggunakan ID untuk baris ini, kita dapat menentukan di mana basis data rusak. Kami melakukannya dengan menggunakan SELECT
pernyataan 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 SELECT
perintah 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
INSERT
pernyataan dalam dump2.sql
file 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.sql
file dan tempel ke dump.sql
file tempat ERROR
komentar muncul.
- Ganti
ROLLBACK; -- due to errors
di akhir file dengan COMMIT;
.
- Tambahkan kode berikut ke bagian atas
dump.sql
file. 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.sqlite
database kosong menggunakan sqlite3 places.sqlite
. Ketik .read dump.sql
untuk 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 PRAGMA
perintah yang diperbarui dari artikel itu.
1 SQL biasanya tidak menjamin bahwa output basis data akan diberikan dalam urutan apa pun kecuali Anda menggunakan ORDER BY
klausa. Namun, ORDER BY
kemungkinan 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_places
entri tabel dengan ID berurutan, sehingga kita dapat mengasumsikan bahwa semua output dipesan oleh ID.