Bozuk bir Firefox places.sqlite veritabanını nasıl onarabilirim?


15

RAM'imle (birkaç kez mavi ekran, Windows XP) bazı sorunlar yaşadım ve şimdi Firefox veritabanlarım hasar görüyor. Firefox çalışıyor, ancak geçmişim gitti ve pragma integrity_checküzerinde çalışırken bazı tutarsızlıklar ve hatalar bildiriyor places.sqlite:

veritabanı diski görüntüsü bozuk

Şimdi soru, SQLite Veritabanlarını nasıl onarabilirim?


2
İleride başvurmak üzere, FEBE (Firefox Ortam Yedekleme Uzantısı) gelecekte yardımcı olabilir. Tüm profili kopyalar ve tek bir yedek olarak paketler. Sorunuza cevap vermediğini biliyorum, ancak ileride bilmek yararlı olabilir. bit.ly/aumThw
Urda

Google çalışanlarının bu soruyu bulmasına yardımcı olmak için düzenlendi.
bwDraco

Yanıtlar:


22

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>.defaultklasördedir.
  • Çalışıyorsa Firefox'u kapatın.
  • Rehber veritabanı places.sqlitedosyadadır. Dosya bozulma nedeniyle değiştirildiyse, places.sqlite.corruptkurtarma için dosyayı kullanın . places.sqlite.bakVeya adlı dosyanın yedek bir kopyasını oluşturun places.sqlite.corrupt.bak.
  • Veritabanı dosyasını ( sqlite3 places.sqliteveya 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, ERRORdö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 INSERTsö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_placesTablodaki 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, INSERTifadede 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ı, ERRORaçı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 SELECTkomutu 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 INSERTifadeler dump2.sqldosya 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.sqlDosyanın tüm içeriğini kopyalayın dump.sqlve ERRORyorumun göründüğü dosyaya yapıştırın .
  • Değiştir ROLLBACK; -- due to errorsile dosyanın sonunda COMMIT;.
  • Aşağıdaki kodu dump.sqldosyanı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.sqliteve ardından SQLite kabuğunu places.sqlitekullanarak boş bir veritabanı oluşturun sqlite3 places.sqlite. Tip .read dump.sqlveritabanı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, PRAGMAbu makaleden güncellenmiş komutları dahil ettim .


1 SQL, ORDER BYcümle kullanmadığınız sürece normalde veritabanı çıktısının herhangi bir sırada verileceğini garanti etmez . Bununla birlikte, ORDER BYmuhtemelen 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_placessıralı kimlikleri olan tablo girdilerini yazar , böylece tüm çıktının kimliğe göre sıralandığını varsayabiliriz.


3
Bu saf bir mükemmellik. Hemen hemen tüm tarihi bozuk bir yerden kurtarmak bana yardımcı oldu. Çok teşekkürler!!
Ashutosh Jindal

İki değişiklikle yardımcı oldu: 1) ";" user_version satırında; 2) herhangi bir nedenle, "bozuk" dosyam beklenenden "bir daha az" olan bir şema sürümüne sahipti. Yönteminiz başlangıçta işe yaramadı sonra, dökümü 10MB yeni veritabanına alma denedim ve eski tablo bir sütun daha az olduğu için başarısız oldu. Kaynak kodu bağlantısına bir bakış, neler olduğunu anlamamı sağladı. Müthiş yazı !!!
Tilman Hausherr

@TilmanHausherr: Adreslendi. Sütun değişikliği sorununu önlemek için, veritabanı şemasının değişmemesi için yolsuzluğu fark ettiğiniz anda ve Firefox'u güncellemeden önce bu yanıttaki adımları izlediğinizden emin olun. Daha eski bir şema sürümünü ayarlamayı da deneyebilirsiniz; veritabanını geri yüklediğinizde Firefox yeni sürüme güncelleyecektir.
bwDraco

Önceki şema sürümünü ayarlamak ilk yorumumu yazarken yaptığım şeydi, yani zaten başarılıydım :-) Evet, yolsuzluğu hemen fark etmediğimden şüpheleniyorum, genellikle sadece bir "eski URL" belirir ve hiçbir şey olmaz.
Tilman Hausherr

Harika iş! Onu güncellediğim için aktif sorulara geri koyduğuna sevindim.
fixer1234 23:15

4

Peki, ne kadar hasar gördüğüne bağlı olarak, onarım mümkün olmayabilir. En iyi seçeneğiniz muhtemelen db'yi kullanarak denemeye ve sqlitesonra ne kurtarabileceğinize bakmaktır.

Bu başarısız olursa, muhtemelen yedeklemeden geri yüklemeniz gerekir.

Bir veritabanını dökmek ve yeniden oluşturmak için şu komutu kullanın .dump:

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

1
Teşekkür ederim. SO yazı işe yaramadı çünkü yararlı değildi, ama bağlantıda başvurulan çözüm işe yaradı d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Tüm faviconslar artık yok, ama siteleri ziyaret ettikçe yeniden inşa ediyorum. Tekrar teşekkürler!
Bobby

stackoverflow.com/questions/2255305/… bağlantı yukarıdaki soru, yazar tarafından gönüllü olarak kaldırıldı. Cevap aşağıda yardımcı olabilir.
user66001

@ user66001: Evet, OP sorularını sildi. İlgili komutu kopyaladım.
sleske

Bu benim için işe yaramadı ve bir places.sqlite.corruptdosya buldum . Benim için çalışan bir çözümle başka bir cevap gönderdim .
Daniel

2

Her zaman olduğu gibi böyle bir onarım gerçekleştirirken, önce profil dizininizde bulunan places.sqlite dosyanızın en az bir yedek kopyasını almanızı öneririz. Bir yedeğe sahip olmak, bu tür sorunları onarmak için çeşitli farklı şeyler denemenizi sağlarken, onarım denemesi işleri daha da kötüleştirirse, her zaman yedeklemenin başka bir kopyasını tekrar deneyebileceğinizden emin olabilirsiniz.

Neyin bozuk olduğuna ve ne kadar kötü bozulduğuna bağlı olarak, Rehber Bakımı uzantısıyla ilgili sorunları çözmek mümkün olabilir . Birkaç kez bozuk places.sqlite dosyası ile sona erdi. Rehber Bakımı , seçenekler iletişim kutusunda işlemler olarak sağladığı çeşitli denetimleri / düzeltmeleri çalıştırarak her seferinde sorunu çözebilmiştir. Çeşitli farklı kontroller ve / veya raporlar sadece birkaç dakika ila dakika sürmelidir.

Bu işe yaramazsa, DragonLord'un yukarıda açıklandığı şekilde manuel olarak sabitleme yoluna gitmek gerekli olan şey olabilir.


1

MDN'de açıklanan bu işlem, ziyaret ettiğim yeni sayfaların tarayıcı geçmişine kaydedilmemesi sorununu çözmeme yardımcı oldu. Ben places.sqlite.corrupt(veya places.sqlite-corrupt) bir dosya yoktu , ama benim places.sqlitedosya bütünlüğünü kontrol veritabanı disk görüntü hatalı biçimlendirilmiş olduğunu ortaya koydu .

Buradan devam etmeden önce Firefox'tan çıkın ve Firefox profilinizin yedeğini alın.

$ 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

Firefox'u başlatın. Tarih yeniden çalışıyor olmalı.

Firefox 60.0.1 yüklü bir Mac kullanıyorum. Platformunuz için komutları ayarlamanız gerekebilir.


Teşekkürler Daniel, her zaman gerçek komut prosedürünü görmek için yararlı
not2qubit
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.