Wie repariere ich eine beschädigte Firefox places.sqlite-Datenbank?

15

Ich hatte einige Probleme mit meinem RAM (Bluescreen mehrmals, Windows XP) und jetzt sind meine Firefox-Datenbanken beschädigt. Firefox funktioniert, aber meine Geschichte ist vorbei und es ist berichtet mehrere Inkonsistenzen und Fehler bei der Ausführung pragma integrity_checkauf places.sqlite:

Das Datenbank-Image ist fehlerhaft

Nun die Frage, wie repariere ich SQLite-Datenbanken?

Bobby
quelle
2
Zum späteren Nachschlagen kann die FEBE (Firefox Environment Backup Extension) in Zukunft hilfreich sein. Kopiert das gesamte Profil und fasst es als einzelne Sicherung zusammen. Ich weiß, dass es Ihre Frage nicht beantwortet, aber es kann hilfreich sein, es in Zukunft zu wissen. bit.ly/aumThw
Urda
Bearbeitet, um Googlern das Auffinden dieser Frage zu erleichtern.
bwDraco

Antworten:

22

Hinweis

Da Firefox geschlossen sein muss, um diesen Vorgang auszuführen, müssen Sie diese Seite in einem anderen Webbrowser öffnen oder ausdrucken, bevor Sie fortfahren.


Nach stundenlanger Arbeit bei dem Versuch, die Places-Datenbank wiederherzustellen, und dem Lesen des Firefox-Quellcodes, habe ich es geschafft, erfolgreich zu sein. So habe ich es gemacht:

  • Laden Sie die neueste Version der SQLite-Shell herunter und extrahieren Sie sie in Ihren Profilordner. Unter Windows Vista und Windows 7 befindet es sich im C:\Users\<username>\AppData\Roaming\Mozilla\Firefox\Profiles\<code>.defaultOrdner.
  • Schließen Sie Firefox, wenn es ausgeführt wird.
  • Die Places-Datenbank befindet sich in der places.sqliteDatei. Wenn die Datei aufgrund einer Beschädigung ersetzt wurde, verwenden Sie sie places.sqlite.corruptzur Wiederherstellung. Erstellen Sie eine Sicherungskopie der Datei mit dem Namen places.sqlite.bakoder places.sqlite.corrupt.bak.
  • Verwenden Sie die SQLite-Shell, um die Datenbankdatei zu öffnen ( sqlite3 places.sqliteoder sqlite3 places.sqlite.corrupt), und geben Sie Folgendes ein:
.output dump.sql    -- sends output to file dump.sql
.dump               -- dumps database to file
  • Da die Datenbank beschädigt ist, ist der resultierende Datenbankspeicherauszug nicht vollständig, und nicht alle wiederherstellbaren Daten wurden abgerufen. Um festzustellen, wo der Fehler aufgetreten ist, suchen Sie ERRORin einem SQL-Kommentar in der Speicherauszugsdatei nach dem Wort (Großbuchstaben) dump.sql(dazu habe ich Notepad ++ verwendet), und lesen Sie den SQL- INSERTBefehl darüber, um die betreffende Tabelle zu bestimmen. In meinem Fall ist der Tisch beschädigt moz_places. (Eine Beschreibung der Tabellen in der Places-Datenbank mit einem veralteten ER-Diagramm finden Sie hier .) Ich erkläre, wie Sie zusätzliche Daten nur aus dieser Tabelle wiederherstellen können. Das folgende Verfahren ist wahrscheinlich nicht für die anderen Tabellen anwendbar. Überspringen Sie daher diese Unterschritte, wenn eine andere Tabelle als moz_placesdie betroffen ist.)

    • Jede Zeile in der moz_placesTabelle hat eine ID. Die Zeilen werden in der Reihenfolge dieser ID aus der Tabelle ausgegeben. 1 Die ID ist der erste Wert nach der öffnenden Klammer in der INSERTAnweisung. Der Bereich, in dem die Datenbank beschädigt ist, besteht wahrscheinlich aus einem kleinen Zeilenblock in dieser Tabelle. Die Idee dabei ist, diesen beschädigten Bereich zu überspringen und so viele Daten wie möglich wiederherzustellen. Der Startbereich eines solchen Blocks wird im Dump als Zeile vor dem ERRORKommentar dargestellt. Anhand der ID für diese Zeile können wir feststellen, wo die Datenbank beschädigt ist. Wir tun dies, indem wir SELECTAnweisungen mit der ID als Bedingung verwenden. Dieser Prozess erfordert einige Versuche und Irrtümer. Wenn zum Beispiel die letzte ID vor dem Fehler 49999 war und der Fehler folgt, beginnt der beschädigte Block mit der ID 50000. Verwenden Sie Anweisungen wie:

    - unnötige Ausgabe unterdrücken
    - Der folgende Befehl gilt für Windows-Systeme
    - Verwenden Sie für Linux und andere Unix- und Unix-ähnliche Systeme .output / dev / null
    .output NUL
    
    SELECT ID FROM Moz_Places WHERE ID> = 50100;
    
    • Passen Sie den Wert an id >=und wiederholen Sie den obigen SELECTBefehl, bis Sie den kleinsten Wert gefunden haben, bei dem SQLite keinen Fehler ausgibt. Dies ist die ID, die sich auf die Zeile bezieht, ab der zusätzliche Daten wiederhergestellt werden können. Angenommen, diese ID ist 50200. Geben Sie Folgendes ein, um diese Daten zu sichern:

    .output dump2.sql
    .mode einfügen
    SELECT * FROM moz_places WHERE id> = 50200;
    
    - Normales Ausgabeverhalten wiederherstellen
    .ausgabe stdout
    .mode Liste
    
    • Beachten Sie, dass die INSERTAnweisungen in der dump2.sqlDatei mit beginnen INSERT INTO table VALUES. Verwenden Sie daher die Funktion zum Suchen und Ersetzen in Ihrem Texteditor, um alle Instanzen dieser Zeichenfolge durch zu ersetzen INSERT INTO moz_places VALUES.
    • Kopieren Sie den gesamten Inhalt der dump2.sqlDatei und fügen Sie ihn in die dump.sqlDatei ein, in der der ERRORKommentar angezeigt wird.
  • Ersetzen Sie das ROLLBACK; -- due to errorsam Ende der Datei durch COMMIT;.
  • Fügen Sie den folgenden Code oben in die dump.sqlDatei ein. Ersetzen Sie <version>den Wert wie folgt durch den korrekten Wert, der für Firefox erforderlich ist, um die Datenbankschemaversion basierend auf der Firefox-Version zu ermitteln (diese finden Sie in der Firefox-Quelldatei toolkit/components/places/Database.cpp):
    • Firefox 52: Schema Version 35
    • Firefox 53: Schema Version 36
    • Firefox 57: Schema Version 39
    • Firefox 58: Schema Version 41
    • Firefox 60: Schema-Version 43
    • Firefox 61: Schema-Version 47
    • Firefox 62: Schema Version 52
    • Firefox 69: Schema Version 53

PRAGMA user_version = <version>;
PRAGMA journal_mode = abgeschnitten;
PRAGMA page_size = 32768;
VAKUUM;
PRAGMA journal_mode = wal;
  • Beenden Sie die SQLite-Shell, löschen Sie sie places.sqliteund starten Sie die SQLite-Shell, indem Sie eine leere places.sqliteDatenbank erstellen sqlite3 places.sqlite. Geben Sie ein .read dump.sql, um den SQL-Speicherauszug in die Datenbank zu laden.
  • Starten Sie Firefox und vergewissern Sie sich, dass Ihr Verlauf und Ihre Adressleiste wie vorgesehen funktionieren. Wenn Sie bestätigt haben, dass alles in Ordnung ist, entfernen Sie die Datenbank-Dump-Dateien und die ausführbare SQLite-Shell aus dem Profilordner.

Weitere relevante Informationen finden Sie auf den folgenden Seiten:

Ein vereinfachtes Verfahren wird in diesem MDN-Artikel beschrieben , ich habe es jedoch nicht getestet. Trotzdem habe ich aktualisierte PRAGMABefehle aus diesem Artikel übernommen.


1 SQL garantiert normalerweise nicht, dass die Datenbankausgabe in beliebiger Reihenfolge erfolgt, es sei denn, Sie verwenden die ORDER BYKlausel. Es ist jedoch ORDER BYwahrscheinlich, dass keine Ausgabe in einer beschädigten Datenbank erstellt wird (da SQLite die gesamte Tabelle lesen muss, bevor eine Ausgabe erstellt werden kann). Nach meinem Kenntnisstand schreibt Firefox moz_placesTabelleneinträge immer mit fortlaufenden IDs, sodass wir davon ausgehen können, dass die gesamte Ausgabe nach ID sortiert ist.

bwDraco
quelle
3
Das ist pure Ehrfurcht gebietend. Hat mir geholfen, fast den gesamten Verlauf von einer beschädigten places.sqlite wiederherzustellen. Danke vielmals!!
Ashutosh Jindal
Es hat geholfen, mit zwei Änderungen: 1) Fügen Sie ein ";" in der user_version Zeile; 2) Aus irgendeinem Grund hatte meine "korrupte" Datei eine Schemaversion, die "eine weniger" war als erwartet. Nachdem Ihre Methode anfangs nicht funktioniert hat, habe ich versucht, den Speicherauszug in die neue 10-MB-Datenbank zu importieren, was fehlgeschlagen ist, da die alte Tabelle eine Spalte weniger enthält. Ein Blick auf den Quellcode-Link ließ mich verstehen, was los war. Super Beitrag !!!
Tilman Hausherr
@ TilmanHausherr: Angesprochen. Befolgen Sie die Schritte in dieser Antwort, um das Problem des Spaltenwechsels zu vermeiden, sobald Sie eine Beschädigung feststellen und bevor Sie Firefox aktualisieren, damit das Datenbankschema nicht geändert wird. Sie können auch versuchen, eine ältere Schemaversion festzulegen. Firefox aktualisiert diese auf die neue Version, wenn Sie die Datenbank wiederherstellen.
bwDraco
Das Einstellen der vorherigen Schemaversion war das, was ich getan hatte, als ich meinen ersten Kommentar schrieb, dh ich war bereits erfolgreich :-) Ja, ich vermute, dass ich die Korruption nicht sofort bemerkt habe, ich bemerke es normalerweise nur, wenn ich Zeichen eingebe, die eine machen sollten "alte URL" erscheint und nichts passiert.
Tilman Hausherr
Ausgezeichnete Arbeit! Ich bin froh, dass du es aktualisiert hast, wodurch es wieder in die aktiven Fragen eingefügt wurde, in denen ich es entdeckt habe.
Fixer1234
4

Nun, je nachdem, wie beschädigt es ist, ist eine Reparatur möglicherweise nicht möglich. Ihre beste Wette ist wahrscheinlich, die Datenbank mit auszuwerfen sqliteund dann zu sehen, was Sie retten können.

Wenn dies fehlschlägt, müssen Sie wahrscheinlich von der Sicherung wiederherstellen.

Verwenden Sie den folgenden Befehl, um eine Datenbank zu sichern und neu zu erstellen .dump:

sqlite places.sqlite .dump | sqlite places-new.sqlite
sleske
quelle
1
Danke. Der SO-Beitrag war nicht hilfreich, da er nicht funktioniert hat, aber die Lösung, auf die im Link verwiesen wird, hat funktioniert d:\sqlite3.exe d:\idimager.cat.db .dump | d:\sqlite3.exe d:\newdb.cat.db. Alle Favoriten sind jetzt weg, aber ich baue sie gerade auf, während ich die Seiten besuche. Danke noch einmal!
Bobby
Der oben aufgeführte Link zu stackoverflow.com/questions/2255305/… wurde vom Autor freiwillig entfernt. Die Antwort unten kann hilfreich sein.
user66001
@ user66001: Ja, das OP hat seine Frage gelöscht. Ich habe den entsprechenden Befehl kopiert.
sleske
Das hat bei mir nicht geklappt und ich habe eine places.sqlite.corruptAkte bekommen. Ich habe eine andere Antwort mit einer Lösung gepostet , die für mich funktioniert hat.
Daniel
2

Wie immer bei einer solchen Reparatur empfehle ich, zuerst mindestens eine Sicherungskopie Ihrer places.sqlite-Datei zu erstellen, die sich in Ihrem Profilverzeichnis befindet. Mit einem Backup können Sie verschiedene Dinge ausprobieren, um solche Probleme zu reparieren, wobei Sie wissen, dass Sie, wenn die versuchte Reparatur die Situation verschlimmert, immer eine weitere Kopie des Backups erstellen können, um es erneut zu versuchen.

Je nachdem, was beschädigt ist und wie stark es beschädigt ist, können möglicherweise die Probleme mit der Erweiterung Places Maintenance behoben werden . Ich habe bei einigen Gelegenheiten eine beschädigte places.sqlite-Datei gefunden. Places Maintenance konnte das Problem jedes Mal beheben, indem verschiedene Überprüfungen / Korrekturen ausgeführt wurden, die im Dialogfeld "Optionen" als Vorgänge bereitgestellt wurden. Die verschiedenen Überprüfungen und / oder Berichte sollten nur wenige Momente bis Minuten dauern.

Wenn dies nicht funktioniert, ist es möglicherweise erforderlich, das Problem auf ähnliche Weise wie oben in DragonLord beschrieben manuell zu beheben.

Makyen
quelle
1

Dieser in MDN beschriebene Prozess hat mir geholfen, ein Problem zu beheben, bei dem neue Seiten, die ich besucht habe, nicht im Browserverlauf aufgezeichnet wurden. Ich hatte keine places.sqlite.corrupt(oder places.sqlite-corrupt) Datei, aber die Überprüfung der Integrität meiner places.sqliteDatei ergab, dass das Datenbank-Disk-Image ein fehlerhafter Fehler ist.

Beenden Sie Firefox und erstellen Sie eine Sicherungskopie Ihres Firefox-Profils, bevor Sie hier fortfahren.

$ 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

Starten Sie Firefox. Die Geschichte sollte wieder funktionieren.

Ich bin auf einem Mac mit Firefox 60.0.1. Möglicherweise müssen Sie die Befehle für Ihre Plattform anpassen.

Daniel
quelle
Vielen Dank Daniel, immer hilfreich, um die eigentliche Befehlsprozedur zu sehen
not2qubit