Come eseguire il backup del database sqlite?


93

Qual è il modo corretto per farlo? Copio solo il file .sq3?

Cosa succede se ci sono utenti sul sito e il file viene scritto mentre viene copiato?



1
Quale lingua e driver stai usando per accedere al database?
CL.

1
Sto usando PHP e l'estensione PDO
thelolcat

Attualmente esiste una richiesta di funzionalità per esporre l'API di backup sqlite in php: bugs.php.net/bug.php?id=70950
Brian Minton

Risposte:


152

Lo strumento da riga di comando sqlite3 include il .backupcomando punto .

Puoi connetterti al tuo database con:

sqlite3 my_database.sq3

ed esegui il comando punto di backup con:

.backup backup_file.sq3

Invece della connessione interattiva al database, puoi anche fare il backup e chiudere la connessione in seguito con

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

In entrambi i casi il risultato è una copia denominata backup_file.sq3del databasemy_database.sq3 .

È diverso dalla copia regolare dei file, perché si prende cura di tutti gli utenti che attualmente lavorano sul database. Sono presenti blocchi appropriati impostati sul database, quindi il backup viene eseguito esclusivamente.


68
Puoi fare tutto in una riga ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell

@Googie: possiamo usarlo per la replica? oppure
lunedì

4
@mOna: questo è solo un meccanismo per eseguire i backup. Replicazione significa propagare le modifiche al volo (una specie di database distribuito), cosa che questo non farà per te.
Googie

Grazie per la risposta :)
mOna

1
@RonJohn In realtà fa una copia di un file, ma risponde anche che l'accesso in scrittura al database è limitato con i blocchi appropriati, quindi è un'operazione atomica, senza modifiche intermedie.
Googie

5

.backup è il modo migliore.

sqlite3 my_database .backup my_database.back

puoi anche provare il comando .dump, che ti dà la possibilità di scaricare l'intero database o le tabelle in un file di testo. Se è specificato TABLE, solo le tabelle di dump che corrispondono al pattern LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Un buon modo per creare una copia di archivio utilizzando dump e store, ricostruire il database in un secondo momento.

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

Controlla anche questa domanda I comandi .backup e .dump di SQLite3 bloccano il database?


4
Su SQLite 3.8.2, .backupnon funziona come mostrato sopra ("argomento FILENAME mancante su .backup")
Francesc Rosas

4
Questa è la migliore risposta. Se stai usando .backup su un database funzionante usato da molti, potrebbe non funzionare perché a un certo punto il database è bloccato. Quindi se lo stai usando in un CRON non funzionerà e non ti dirà che c'è un errore ... meglio usare .dump (funziona sempre) o l'API fornita da SQLite.
Memristor

@ Memristor Ma .dump non blocca il DB per gli altri? FWIW, preferirei un backup non riuscito (con posta all'amministratore) a un servizio interrotto.
Torsten Bronger

1
Correggi la sintassi .backup nella risposta. Non necessita dell'operatore ">"
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();
}

Stai implicando la copia programmatica a livello di file system dei file di database?
Andreas Tasoulas

4
1. Non dici nemmeno che lingua sia questo codice. L'OP ha detto che sta usando PHP ma questo sembra essere codice java. 2. Si copia un file byte per byte. Quale dovrebbe essere il vantaggio di farlo? Java (e php) hanno metodi per copiare i file. Leggere docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Ciò non risolve il problema in cui potrebbe essere scritto il db durante la copia.
Christopher K.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.