Not
Bu yordamı gerçekleştirmek için Firefox'un kapatılması gerektiğinden, devam etmeden önce bu sayfayı başka bir web tarayıcısında açtığınızdan veya yazdırdığınızdan emin olun.
Rehber veritabanını kurtarmaya çalışan saatler geçtikten sonra bile Firefox kaynak kodunu okuduktan sonra başarılı olmayı başardım. İşte böyle yaptım:
- SQLite kabuğunun en son sürümünü indirin ve profil klasörünüze çıkarın. Windows Vista ve Windows 7'de
C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.default
klasördedir.
- Çalışıyorsa Firefox'u kapatın.
- Rehber veritabanı
places.sqlite
dosyadadır. Dosya bozulma nedeniyle değiştirildiyse, places.sqlite.corrupt
kurtarma için dosyayı kullanın . places.sqlite.bak
Veya adlı dosyanın yedek bir kopyasını oluşturun places.sqlite.corrupt.bak
.
- Veritabanı dosyasını (
sqlite3 places.sqlite
veya sqlite3 places.sqlite.corrupt
) açmak için SQLite kabuğunu kullanın , sonra şunu girin:
.output dump.sql -- sends output to file dump.sql
.dump -- dumps database to file
Veritabanı bozuk olduğundan, sonuçta ortaya çıkan veritabanı dökümü tamamlanmamıştır ve kurtarılabilir verilerin tümü alınmamıştır. Hatanın nerede oluştuğunu belirlemek için, ERROR
döküm dosyasının içindeki bir SQL açıklamasında (tüm büyük harf) kelimeyi arayın dump.sql
(bunu yapmak için Notepad ++ kullandım ) ve INSERT
söz konusu tabloyu belirlemek için üstündeki SQL komutunu okuyun . Benim durumumda, hasarlı masa moz_places
. (Yerler veritabanında bulunan tabloların açıklaması, güncel olmayan bir ER diyagramını içeren burada bulunabilir .) Yalnızca bu tablodan ek verilerin nasıl kurtarılacağını açıklayacağım; aşağıdaki yordam muhtemelen diğer tablolar için geçerli değildir, bu nedenle başka bir tablo varsa bu alt adımları atlayın moz_places
.)
moz_places
Tablodaki her satırın bir kimliği vardır. Satırlar bu kimliğin sırasını izleyen tablodan dökülür. 1 Kimlik, INSERT
ifadede açılış parantezini izleyen ilk değerdir . Veritabanının zarar gördüğü alanın bu tablodaki küçük bir satır bloğu olması muhtemeldir; buradaki fikir, bu hasarlı alanı atlamak ve mümkün olduğunca fazla veri kurtarmaktır. Böyle bir bloğun başlangıç alanı, ERROR
açıklama görünmeden önceki satır olarak dökümde gösterilir. Bu satırın kimliğini kullanarak veritabanının nerede hasar gördüğünü belirleyebiliriz. Bunu SELECT
, kimliğe sahip ifadeleri koşul olarak kullanarak yaparız ; bu işlem biraz deneme yanılma gerektirir. Örneğin, hatadan önceki son kimlik 49999 ise ve hata devam ederse, hasarlı blok ID 50000'de başlar.
- gereksiz çıktıları bastırın
- aşağıdaki komut Windows sistemleri içindir
- Linux ve diğer Unix ve Unix benzeri sistemler için .output / dev / null kullanın
. çıktı NUL
Moz_places SEÇİM KİMLİĞİ NEREDE>> 50100;
- Aşağıdaki değeri ayarlayın ve SQLite'ın hata vermesine neden olmayan en küçük değeri bulana kadar
id >=
yukarıdaki SELECT
komutu tekrarlayın . Bu, ek verileri kurtarabileceğimiz satırı ifade eden kimliktir. Bu kimliğin 50200 olduğunu varsayalım. Bu verileri dökmek için şunu girin:
.output dökümü2.sql
.mode eki
SELECT * FROM moz_places NEREDE kimliği> = 50200;
- normal çıktı davranışını geri yükle
. çıktı stdout
mod listesi
- Not o
INSERT
ifadeler dump2.sql
dosya ile başlar INSERT INTO table VALUES
, bu yüzden bulmak kullanabilir ve bu dize tüm örneklerini değiştirmek için metin editörü özelliğini değiştirin INSERT INTO moz_places VALUES
.
dump2.sql
Dosyanın tüm içeriğini kopyalayın dump.sql
ve ERROR
yorumun göründüğü dosyaya yapıştırın .
- Değiştir
ROLLBACK; -- due to errors
ile dosyanın sonunda COMMIT;
.
- Aşağıdaki kodu
dump.sql
dosyanın üstüne ekleyin . Değiştir <version>
(bu Firefox kaynak dosyada bulunabilir aşağıdaki şekilde Firefox sürümünü temel veritabanı şeması sürümünü belirlemek için Firefox için gerekli olan doğru değer ile toolkit/components/places/Database.cpp
):
- Firefox 52: şema sürüm 35
- Firefox 53: şema sürüm 36
- Firefox 57: şema sürüm 39
- Firefox 58: şema sürüm 41
- Firefox 60: şema sürüm 43
- Firefox 61: şema sürümü 47
- Firefox 62: şema sürüm 52
- Firefox 69: şema sürüm 53
PRAGMA user_version = <sürüm>;
PRAGMA journal_mode = kesme;
PRAGMA sayfa_boyutu = 32768;
VAKUM;
PRAGMA journal_mode = wal;
- SQLite kabuğundan çıkın, silin
places.sqlite
ve ardından SQLite kabuğunu places.sqlite
kullanarak boş bir veritabanı oluşturun sqlite3 places.sqlite
. Tip .read dump.sql
veritabanına SQL dökümü yüklemek için.
- Firefox'u başlatın ve geçmişinizin ve konum çubuğunuzun istendiği gibi çalıştığını doğrulayın. Her şeyin yolunda olduğunu onayladıktan sonra, veritabanı döküm dosyalarını ve SQLite kabuk yürütülebilir dosyasını profil klasöründen kaldırın.
Daha alakalı bilgileri aşağıdaki sayfalarda bulabilirsiniz:
Basitleştirilmiş bir yordam bu MDN makalesinde açıklanmıştır, ancak ben test etmedim. Bununla birlikte, PRAGMA
bu makaleden güncellenmiş komutları dahil ettim .
1 SQL, ORDER BY
cümle kullanmadığınız sürece normalde veritabanı çıktısının herhangi bir sırada verileceğini garanti etmez . Bununla birlikte, ORDER BY
muhtemelen bozuk bir veritabanında herhangi bir çıktı üretemez (SQLite herhangi bir çıktı üretmeden önce tüm tabloyu okumalıdır). Bildiğim kadarıyla, Firefox her zaman moz_places
sıralı kimlikleri olan tablo girdilerini yazar , böylece tüm çıktının kimliğe göre sıralandığını varsayabiliriz.