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

20131
Bobby

Ich hatte einige Probleme mit meinem RAM (mehrmals Bluescreen, 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 Image der Datenbankfestplatte ist fehlerhaft

Nun zur Frage, wie repariere ich SQLite-Datenbanken?

15
Für die zukünftige Verwendung kann die FEBE (Firefox Environment Backup Extension) in der Zukunft hilfreich sein. Kopiert das gesamte Profil und packt es als einzelne Sicherung. Ich weiß, dass Ihre Frage nicht beantwortet wird, aber es könnte hilfreich sein, dies in der Zukunft zu wissen. http://bit.ly/aumThw Urda vor 14 Jahren 2
Bearbeitet, um Googlers zu helfen, diese Frage zu finden. bwDraco vor 9 Jahren 0

4 Antworten auf die Frage

22
bwDraco

Hinweis

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


Nachdem ich stundenlang versucht hatte, die Places-Datenbank wiederherzustellen, selbst wenn ich den Firefox-Quellcode las, ist es mir gelungen. 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, falls es läuft.
  • Die Places-Datenbank befindet sich in der places.sqliteDatei. Wenn die Datei aufgrund einer Beschädigung ersetzt wurde, verwenden Sie die places.sqlite.corruptDatei für die Wiederherstellung. Erstellen Sie eine Sicherungskopie der Datei namens 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 dann 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 herauszufinden, wo der Fehler aufgetreten ist, suchen Sie nach dem Wort ERROR(alle Großbuchstaben) in einem SQL-Kommentar in der Abbilddatei dump.sql(ich habe Notepad ++ verwendet), und lesen Sie den SQL- INSERTBefehl darüber, um die betreffende Tabelle zu ermitteln. In meinem Fall ist der beschädigte Tisch moz_places. (Eine Beschreibung der Tabellen in der Places-Datenbank finden Sie hier ; ein ziemlich veraltetes 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 für das andere nicht anwendbar Tabellen, so überspringen Sie diese Unterschritte, wenn eine andere Tabelle alsmoz_places ist involviert.)

    • 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, der auf die öffnende Klammer in der INSERTAnweisung folgt . Der Bereich, in dem die Datenbank beschädigt ist, ist wahrscheinlich ein kleiner Zeilenblock in dieser Tabelle. Die Idee hier 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. Dazu verwenden wir SELECTAnweisungen mit der ID als Bedingung. Dieser Vorgang erfordert einige Versuche. Wenn beispielsweise die letzte ID vor dem Fehler 49999 war und der Fehler folgt, beginnt der beschädigte Block bei der ID 50000. Verwenden Sie folgende Anweisungen:

    - 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 Ausgabe 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 finden, der nicht dazu führt, dass SQLite einen Fehler ausgibt. Dies ist die ID, die sich auf die Zeile bezieht, von der aus wir zusätzliche Daten wiederherstellen können. Nehmen wir an, diese ID lautet 50200. Geben Sie zum Speichern dieser Daten Folgendes ein:

    .ausgabe dump2.sql .Modus einfügen SELECT * FROM moz_places WO ID> = 50200;  - normales Ausgabeverhalten wiederherstellen .outStdout .Modusliste 
    • Beachten Sie, dass die INSERTAnweisungen in der dump2.sqlDatei mit beginnen INSERT INTO table VALUES. Verwenden Sie daher die Such- und Ersetzungsfunktion 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 am Anfang der dump.sqlDatei hinzu. Ersetzen Sie <version>den korrekten Wert, der für Firefox erforderlich ist, um die Version des Datenbankschemas basierend auf der Firefox-Version zu ermitteln, wie folgt (dies ist in der Firefox-Quelldatei zu finden toolkit/components/places/Database.cpp):
    • Firefox 50: Schemaversion 33
    • Firefox 51: Schemaversion 34
    • Firefox 52: Schemaversion 35
    • Firefox 53: Schemaversion 36
    • Firefox 57: Schemaversion 39
    • Firefox 58: Schemaversion 41
    • Firefox 60: Schemaversion 43
    • Firefox 61: Schemaversion 47

PRAGMA page_size = 4096; PRAGMA user_version = <Version>; 
  • Beenden Sie die SQLite-Shell, löschen Sie sie places.sqliteund starten Sie dann die SQLite-Shell, um eine leere places.sqliteDatenbank zu erstellen sqlite3 places.sqlite. Geben Sie .read dump.sqlden Typ ein, um den SQL-Dump in die Datenbank zu laden.
  • Starten Sie Firefox und vergewissern Sie sich, dass Ihr Verlauf und Ihre Standortleiste wie vorgesehen funktionieren. Wenn Sie bestätigt haben, dass alles in Ordnung ist, entfernen Sie die Datenbankauszugsdateien und die ausführbare SQLite-Shell-Datei aus dem Profilordner.

Weitere relevante Informationen finden Sie auf den folgenden Seiten:


1 SQL garantiert normalerweise nicht, dass die Datenbankausgabe in beliebiger Reihenfolge ausgegeben wird, es sei denn, Sie verwenden die ORDER BYKlausel. Es ORDER BYwird jedoch wahrscheinlich keine Ausgabe in einer beschädigten Datenbank erzeugt (da SQLite die gesamte Tabelle lesen muss, bevor eine Ausgabe erzeugt werden kann). Soweit ich weiß, schreibt Firefox immer moz_placesTabelleneinträge mit fortlaufenden IDs, sodass wir davon ausgehen können, dass alle Ausgaben nach ID geordnet sind.

Das ist pure Großartigkeit. Hat mir geholfen, fast die gesamte Geschichte eines korrupten Places.sqlite wiederherzustellen. Danke vielmals!! Ashutosh Jindal vor 10 Jahren 3
Es hat mit zwei Modifikationen geholfen: 1) Fügen Sie ein ";" in der user_version Zeile; 2) aus irgendeinem Grund hatte meine "beschädigte" Datei eine Schemaversion, die "eine weniger" war als erwartet. Nachdem Ihre Methode anfangs nicht funktioniert hat, habe ich versucht, den Speicherauszug in die neue Datenbank mit 10 MB zu importieren, und schlug fehl, weil die alte Tabelle eine Spalte weniger hatte. Ein Blick auf den Quellcode-Link ließ mich verstehen, was los war. Super Post !!! Tilman Hausherr vor 9 Jahren 0
@ TilmanHausherr: Adressiert. Um das Problem mit der Spaltenänderung zu vermeiden, befolgen Sie die Schritte in dieser Antwort, 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 Version bei der Wiederherstellung der Datenbank auf die neue Version. bwDraco vor 9 Jahren 0
Die Einstellung der vorherigen Schemaversion war das, was ich beim Schreiben meines ersten Kommentars getan hatte, dh ich war bereits erfolgreich :-) Ja, ich habe den Verdacht, dass ich die Korruption nicht sofort bemerkt habe. Ich bemerke es normalerweise nur bei der Eingabe von Zeichen, die einen machen sollen "alte URL" erscheint und nichts passiert. Tilman Hausherr vor 9 Jahren 0
Ausgezeichnete Arbeit! Ich bin froh, dass Sie es aktualisiert haben, was es wieder in die aktiven Fragen brachte, wo ich es gesehen habe. fixer1234 vor 9 Jahren 0
In meiner Dump-Datei wurden keine Fehler angezeigt. Als ich jedoch versuchte, die Datenbank mit .read dump.sql neu zu erstellen, wurden Fehlermeldungen über "doppelte Datensätze" angezeigt, die ich finden und entfernen konnte. Es lohnt sich also, den Befehl .read dump.sql auszuführen, um zu sehen, ob der Problembereich hervorgehoben wird Nat vor 6 Jahren 0
Firefox 59: Schemaversion 41 Scott Hepler vor 6 Jahren 0
Dies ist ein erstaunlicher Beitrag. Ich habe gerade meine 6-monatige Geschichte (~ 130.000 Seiten) gespeichert. Warum habe ich es verloren? Hab ein FF-Update von "60.2.0" auf "60.2.1esr (64-Bit)" erhalten und mit einer älteren * pre-60 * -Version versehentlich wieder geöffnet. Tötete den alten FF mit dem Task-Manager (tue das nicht) in der Hoffnung, er würde keinen Schaden anrichten. Zu spät. Wiedereröffnet mit neuen und allen Lesezeichen + Symbolleiste, Verlauf weg. Glücklicherweise war `places.sqlite.corrupt` nicht wirklich korrupt, könnte also einfach zurückkopiert werden. (Sie können auch die Prüfung hinzufügen: `pragma foreign_key_check;` not2qubit vor 6 Jahren 0
4
sleske

Je nachdem, wie beschädigt es ist, ist eine Reparatur möglicherweise nicht möglich. Ihre beste Wette ist wahrscheinlich zu versuchen und die Db mit Dump auszugeben sqlite, um zu sehen, was Sie retten können.

Wenn dies fehlschlägt, müssen Sie wahrscheinlich die Sicherungskopie wiederherstellen.

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

sqlite places.sqlite .dump | sqlite places-new.sqlite 
Vielen Dank. Der SO-Beitrag war nicht hilfreich, da er nicht funktionierte, aber die im Link genannte Lösung funktionierte `d: \ sqlite3.exe d: \ idimager.cat.db .dump | d: \ sqlite3.exe d: \ newdb.cat.db`. Alle Favicons sind jetzt verschwunden, aber ich baue die Gebäude auf, wenn ich sie besuche. Danke noch einmal! Bobby vor 14 Jahren 1
http://stackoverflow.com/questions/2255305/how-to-repair-a-malformed-sqlite-database link in der obigen Frage, wurde freiwillig vom Autor entfernt. Die Antwort [unten] (http://superuser.com/questions/111998/random-text-to-cause-answer-highlighting/436077#436077) kann hilfreich sein. user66001 vor 11 Jahren 0
@ user66001: Ja, das OP hat ihre Frage gelöscht. Ich habe den entsprechenden Befehl kopiert. sleske vor 7 Jahren 0
Das hat bei mir nicht funktioniert, und ich bekam eine `places.sqlite.corrupt'-Datei. Ich habe [eine weitere Antwort] (https://superuser.com/a/1329161/86694) mit einer Lösung gepostet, die für mich funktioniert hat. Daniel vor 6 Jahren 0
2
Makyen

Wie immer bei einer solchen Reparatur empfehle ich Ihnen, mindestens eine Sicherungskopie Ihrer Datei places.sqlite zu erstellen, die sich in Ihrem Profilverzeichnis befindet. Wenn Sie ein Backup haben, können Sie verschiedene Dinge ausprobieren, um solche Probleme zu beheben, während Sie wissen, dass Sie, wenn der Reparaturversuch die Dinge verschlimmert, immer eine weitere Kopie des Backups erstellen und es erneut versuchen können.

Je nachdem, was beschädigt ist und wie stark es beschädigt ist, können 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 in seinem Optionsdialog als Vorgänge bereitgestellt werden. Die verschiedenen Überprüfungen und / oder Berichte sollten nur wenige Minuten bis Minuten dauern.

Wenn dies nicht funktioniert, ist es möglicherweise notwendig, den Pfad der manuellen Korrektur in einer Weise zu ändern, die der von DragonLord oben beschriebenen ähnelt.

1
Daniel

Dieser im MDN beschriebene Vorgang half mir, ein Problem zu lösen, bei dem die von mir besuchten Seiten 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 Image der Datenbankfestplatte fehlerhaft 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.

Danke Daniel, immer hilfreich, um die eigentliche Befehlsabwicklung zu sehen not2qubit vor 6 Jahren 0