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>.default
Ordner.
- Schließen Sie Firefox, wenn es ausgeführt wird.
- Die Places-Datenbank befindet sich in der
places.sqlite
Datei. Wenn die Datei aufgrund einer Beschädigung ersetzt wurde, verwenden Sie sie places.sqlite.corrupt
zur Wiederherstellung. Erstellen Sie eine Sicherungskopie der Datei mit dem Namen places.sqlite.bak
oder places.sqlite.corrupt.bak
.
- Verwenden Sie die SQLite-Shell, um die Datenbankdatei zu öffnen (
sqlite3 places.sqlite
oder 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 ERROR
in einem SQL-Kommentar in der Speicherauszugsdatei nach dem Wort (Großbuchstaben) dump.sql
(dazu habe ich Notepad ++ verwendet), und lesen Sie den SQL- INSERT
Befehl 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_places
die betroffen ist.)
- Jede Zeile in der
moz_places
Tabelle 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 INSERT
Anweisung. 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 ERROR
Kommentar dargestellt. Anhand der ID für diese Zeile können wir feststellen, wo die Datenbank beschädigt ist. Wir tun dies, indem wir SELECT
Anweisungen 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 SELECT
Befehl, 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
INSERT
Anweisungen in der dump2.sql
Datei 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.sql
Datei und fügen Sie ihn in die dump.sql
Datei ein, in der der ERROR
Kommentar angezeigt wird.
- Ersetzen Sie das
ROLLBACK; -- due to errors
am Ende der Datei durch COMMIT;
.
- Fügen Sie den folgenden Code oben in die
dump.sql
Datei 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.sqlite
und starten Sie die SQLite-Shell, indem Sie eine leere places.sqlite
Datenbank 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 PRAGMA
Befehle aus diesem Artikel übernommen.
1 SQL garantiert normalerweise nicht, dass die Datenbankausgabe in beliebiger Reihenfolge erfolgt, es sei denn, Sie verwenden die ORDER BY
Klausel. Es ist jedoch ORDER BY
wahrscheinlich, 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_places
Tabelleneinträge immer mit fortlaufenden IDs, sodass wir davon ausgehen können, dass die gesamte Ausgabe nach ID sortiert ist.