Wie sichere ich eine SQLite-Datenbank?

92

Was ist der richtige Weg, um es zu tun? Kopiere ich nur die .sq3-Datei?

Was ist, wenn sich Benutzer auf der Site befinden und die Datei während des Kopierens geschrieben wird?

thelolcat
quelle
6
SQLite hat eine API dafür
Colonel Thirty Two
1
Mit welcher Sprache und welchem ​​Treiber greifen Sie auf die Datenbank zu?
CL.
1
Ich benutze PHP und die PDO-Erweiterung
Thelolcat
Derzeit gibt es eine Feature-Anfrage, um die SQLite-Backup-API in PHP verfügbar zu machen
Brian Minton

Antworten:

152

Das Befehlszeilentool sqlite3 enthält den .backupBefehl dot .

Sie können eine Verbindung zu Ihrer Datenbank herstellen mit:

sqlite3 my_database.sq3

und führen Sie den Sicherungspunktbefehl aus mit:

.backup backup_file.sq3

Anstelle der interaktiven Verbindung zur Datenbank können Sie auch die Sicherung durchführen und die Verbindung anschließend mit schließen

sqlite3 my_database.sq3 ".backup 'backup_file.sq3'"

In beiden Fällen ist das Ergebnis eine Kopie mit dem Namen backup_file.sq3der Datenbank my_database.sq3.

Es unterscheidet sich vom regulären Kopieren von Dateien, da es sich um alle Benutzer kümmert, die derzeit an der Datenbank arbeiten. Für die Datenbank sind geeignete Sperren festgelegt, sodass die Sicherung ausschließlich erfolgt.

Googie
quelle
68
Sie können alles in einer Zeile tun ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell
@Googie: Können wir es für die Replikation verwenden? oder
Montag,
4
@mOna: Dies ist nur ein Mechanismus zum Erstellen von Backups. Replikation bedeutet, Änderungen im laufenden Betrieb weiterzugeben (eine Art verteilte Datenbank), was für Sie nicht der Fall ist.
Googie
Danke für die Antwort :)
Montag,
1
@RonJohn Es erstellt tatsächlich eine Kopie einer Datei, stellt aber auch sicher, dass der Schreibzugriff auf die Datenbank durch geeignete Sperren eingeschränkt ist. Es handelt sich also um eine atomare Operation, keine Zwischenänderungen.
Googie
5

.backup ist der beste Weg.

sqlite3 my_database .backup my_database.back

Sie können auch den Befehl .dump ausprobieren, mit dem Sie die gesamte Datenbank oder Tabellen in eine Textdatei sichern können. Wenn TABLE angegeben ist, werden nur Dump-Tabellen ausgegeben, die dem LIKE-Muster TABLE entsprechen.

sqlite3 my_database .dump > my_database.back

Rekonstruieren Sie die Datenbank zu einem späteren Zeitpunkt, um mithilfe von Dump and Store eine Archivierungskopie zu erstellen.

sqlite3 my_database .dump | gzip -c > my_database.dump.gz
zcat my_database.dump.gz | sqlite3 my_database

Überprüfen Sie auch diese Frage. Sperren die SQLite3-Befehle .backup und .dump die Datenbank?

Lava Sangeetham
quelle
4
Auf SQLite 3.8.2 .backupfunktioniert nicht wie oben gezeigt ("fehlendes FILENAME-Argument auf .backup")
Francesc Rosas
4
Dies ist die beste Antwort. Wenn Sie .backup für eine von vielen verwendete Arbeitsdatenbank verwenden, funktioniert dies möglicherweise nicht, da die Datenbank irgendwann gesperrt ist. Wenn Sie dies in einem CRON verwenden, funktioniert es nicht und es wird Ihnen nicht mitgeteilt, dass ein Fehler vorliegt. Verwenden Sie besser .dump (funktioniert immer) oder die von SQLite angegebene API.
Memristor
@Memristor Aber sperrt .dump die DB nicht für andere? FWIW, ich würde eine fehlgeschlagene Sicherung (mit E-Mail an den Administrator) einem gestörten Dienst vorziehen.
Torsten Bronger
1
Bitte korrigieren Sie die .backup-Syntax in Ihrer Antwort. Es braucht keinen '>' Operator
Nashev
-23
try {
    final String inFileName = "/data/data/your app package/databases/db";
    File dbFile = new File(inFileName);
    FileInputStream fis = new FileInputStream(dbFile);
    String path = Environment.getExternalStorageDirectory().getAbsolutePath() + "/CALC/Backup";
    File dir = new File(path);
    if (!dir.exists()) dir.mkdirs();
    String outFileName = path + "/filename"; // output file name
    // Open the empty db as the output stream
    OutputStream output = new FileOutputStream(outFileName);

    // Transfer bytes from the inputfile to the outputfile
    byte[] buffer = new byte[1024];
    int length;
    while ((length = fis.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
    Toast.makeText(getActivity(), "Backup Successfully", 2).show();
    // Close the streams
    output.flush();
    output.close();
    fis.close();
} 
catch (Exception e) {
    e.printStackTrace();
}
RAM
quelle
Bedeuten Sie programmgesteuertes Kopieren von Datenbankdateien auf Dateisystemebene?
Andreas Tasoulas
4
1. Sie sagen nicht einmal, welche Sprache dieser Code ist. Das OP sagte, er benutze PHP, aber dies scheint Java-Code zu sein. 2. Sie kopieren eine Datei byteweise. Was sollte der Vorteil davon sein? Java (und PHP) haben Methoden zum Kopieren von Dateien. Lesen Sie docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Damit wird das Problem nicht behoben, in das die Datenbank möglicherweise geschrieben wird, während Sie sie kopieren.
Christopher K.