it-swarm.com.de

So stellen Sie eine beschädigte SQLite3-Datenbank wieder her

Dies ist eine Folgefrage zu einem zuvor beantworteten Beitrag: Gibt es ein Befehlszeilenprogramm zum Überprüfen von SQLite-Datenbanken in Linux?

Wenn eine Datenbank den folgenden Fehler erzeugt:

$ sqlite3 mydata.db "PRAGMA integrity_check"
Error: database disk image is malformed

Gibt es eine Bereinigungsverarbeitung, die ausgeführt werden kann, um die Datenbank in einen verwendbaren Zustand zu bringen? Sogar beim möglichen Verlust einiger korrupter Aufzeichnungen?

Vielen Dank

41
linsek

Wenn es eine automatische Methode gibt, kann SQLite dies bereits tun.

Manchmal besteht die Beschädigung nur oder meistens in Indizes. In diesem Fall können einige oder die meisten Datensätze abgerufen werden, indem versucht wird, die gesamte Datenbank mit .dump zu sichern, und diese Befehle zum Erstellen einer neuen Datenbank verwenden:

$ sqlite3 mydata.db ".dump" | sqlite3 new.db

Dies ist jedoch nicht immer möglich.

Die einfachste und zuverlässigste Methode ist das Wiederherstellen der Datenbankdatei aus der Sicherung.

90
CL.

Ich hatte eine sqlite-Datei, die beschädigt war und ein solches Symptom zeigte.

select count(*) from corruptTable;
return:38000;

Aber wann würde ich versuchen, die Datensätze mit zu laden 

select * from corruptTable;

Es würden nur 7 Datensätze zurückgegeben.

Ich habe mehrere Dinge ausprobiert, aber diese Schritte waren am erfolgreichsten.

Öffnen Sie auf einem Mac das Terminal und führen Sie diese Befehle in Ihrer beschädigten Datenbank aus. (Dies sind sqlite3-Befehle, daher sollten Sie in anderen Systemen andere sqlite3-Editoren oder ähnliche Befehle verwenden können).

1 sqlite3 dbWithCorruptTable.sqlite (Obviously replace "dbWithCorruptTable" to your sqlite3 file that has the corrupt table)
2 .mode insert
3 .output dump_all.sql
4 .dump
5 .exit
6 Manually edit the dump_all.sql file in a text editor and remove the transaction statements. Usually there is a "BEGIN TRANSACTION" statement on the 2nd line of the file and a "ROLLBACK" statement on the last line. Remove these and save the file

Diese Schritte wurden von dieser Website übernommen:

12
johnrechd

Wenn die Datenbank stark beschädigt ist, enthält der .dump Fehler und einige Daten können verloren gehen.

Bei komplexeren Datenschemata bedeutet dies verwaiste und/oder teilweise Datensätze, die die Anwendung verwirren können.

Es kann vorzuziehen sein, .dump für eine Datei zu verwenden und dann einen Texteditor zu verwenden, um problematische Zeilen zu entfernen. Suchen Sie in der Dump-Datei nach ERROR.

9
Stavr00

Ich konnte meine Chrome-Verlaufsdatei (eine sqlite3-Datenbankdatei) auf folgende Weise reparieren:

sqlite3.exe History ".backup History-new"
6
Oliver Kötter

Ich weiß, dass dies eine alte Frage ist, aber ich möchte trotzdem meine Lösung mitteilen. Mein Problem war, dass eine sqlite3-Datenbank von Kodi (xbmc) beschädigt wurde

.dump hat in meinem Fall nicht funktioniert

file is encrypted or is not a database

Was hat funktioniert, ist das Folgende.

  1. Eine Sicherungskopie der alten DB-Datei erstellt
  2. Lassen Sie Kodi eine neue DB-Datei erstellen
  3. Auf this das Header-Format von SQLite-Dateien geprüft
  4. Beide Dateien wurden mit einem Hex-Editor (Segnung) geöffnet und die ersten 96 Bytes geprüft
  5. Die ersten 40 Bytes waren unterschiedlich und ich habe die ersten 40 Bytes von der neuen DB-Datei in die alte DB-Datei kopiert
  6. Danach hat meine Datenbankdatei wieder funktioniert !!!
4
SuiTheDoc

Meine Methode ist ähnlich, verhindert ein Fehler-Rollback-Skript:

sqlite3 database.db ".dump" | sed -e 's|^ROLLBACK;$|COMMIT;|g' | sqlite3 database.new
2

Das hat für mich funktioniert:

Laden Sie das sqlite3-Tools-Paket von here herunter und legen Sie es in einem beliebigen Ordner ab. Legen Sie Ihre beschädigte Datenbank in demselben Ordner ab.

Öffnen Sie eine Eingabeaufforderung.

Geben Sie Folgendes ein:

sqlite3.exe 

(Drücken Sie Enter)

NAME_OF_YOUR_CORRUPTED_DATABASE> ".dump" | sqlite3 new.db 

(Drücken Sie Enter)

Alle anderen Lösungen funktionierten nicht für mich.

1
tmighty

Ich habe mit diesen Schritten eine Datenbankbeschädigung behoben, die durch fehlende Indizes verursacht wurde, und sie funktionieren für mich.

  1. DROP Index: Befehl sqlite drop index

  2. Vakuum ausführen Befehl Sqlite vacuum

  3. Erstellen Sie den Index erneut: Sqlite create index

1
Mohit Chauhan

Das Pragma writable_schema deaktiviert einige Integritätsprüfungen, sodass diese beiden Befehle möglicherweise auch den Trick ausführen und die Db-Anpassungen beibehalten:

PRAGMA writable_schema=ON;
VACUUM;
0
Thinkeye

Mit dem folgenden Fix konnte die Datenbank repariert werden, ohne dass Befehlszeilenprogramme ausgeführt wurden.

Ich habe die Fehlermeldung "Datenbank-Disk-Image ist fehlerhaft" erhalten, als ich mit einer meiner Tabellen gearbeitet habe. Deshalb habe ich [PRAGMA Integritäts-Check] ausgeführt, das zurückgegeben wurde

Hauptfreeliste: Die Anzahl freier Seiten im Header ist zu gering

Auf Baumseite 16198 Zelle 1: 2. Verweis auf Seite 14190

Seite 16988 wird nie verwendet

Seite 46637 wird niemals verwendet

zeile 4493 fehlt im Index Indexname1

zeile 4493 fehlt im Index Indexname2

zeile 4493 fehlt im Index Indexname3

Ich habe zuerst das Schema für die Tabelle mit den fehlerhaften Indizes gespeichert, um diese Indizes neu erstellen zu können. Dann habe ich die Indexnamen 1, 2 und 3 mit dem Befehl [drop index _] gelöscht. Ich habe meine Tabellen einzeln in JSON-Dateien exportiert und dann jede Tabelle gekürzt. Die Integritätsprüfung war zu diesem Zeitpunkt erfolgreich. Anschließend fügte ich die drei Indizes mit dem Befehl [create index _] hinzu und importierte die Datensätze der einzelnen Tabellen aus ihrem JSON-Dateiexport. Beim Ausführen des Befehls zur Integritätsprüfung wird immer noch "ok" mit allen wiederhergestellten Datensätzen zurückgegeben.

0
Gary Z