2014-09-04 25 views
50

Qual è il modo corretto per farlo? Copio semplicemente il file .sq3?Come eseguire il backup del database SQLite?

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

+4

[SQLite ha un'API per questo] (http://sqlite.org/backup.html) –

+1

Che lingua e il driver stai usando per accedere al database? –

+1

sto usando PHP e l'estensione PDO – thelolcat

risposta

88

Lo strumento da riga di comando sqlite3 include .backup dot command.

È possibile connettersi al database con:

sqlite3 my_database.sq3 

ed eseguire il comando di backup dot con:

.backup backup_file.sq3 

Invece del collegamento interattivo al database, si può 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 chiamato backup_file.sq3 del database my_database.sq3.

È diverso dalla copia di file, poiché si occupa di tutti gli utenti che attualmente lavorano nel database. Ci sono blocchi appropriati impostati sul database, quindi il backup viene eseguito esclusivamente.

+56

Puoi fare tutto in una riga ... 'sqlite3 m_database.sq3" .backup m_database.sq3.bak "' –

+0

@Googie: Possiamo usarlo per la replica? oppure – mOna

+3

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

-11
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(); 
} 
+2

Spiegare cosa fa il codice. – Ram

+0

Stai implicando la copia programmatica a livello di file system dei file di database? – atas

+8

Si prega di non fare questo ... –

0

per il backup incrementale in tempo reale (copiando solo le pagine modificate) è possibile utilizzare litereplica.

Implementa la replica di database unidirezionale con supporto al recupero temporizzato, quindi se un record o una tabella vengono accidentalmente eliminati, è possibile ripristinare il db (o il primario o la replica) a un certo punto prima del problema.

Il backup viene aggiornato dopo ogni transazione, pertanto se si verifica un errore nel computer principale si dispone di un backup aggiornato nell'altro endpoint.

Nel lato master l'applicazione si aprirà il db utilizzando un URI modificato, in questo modo:

“file:/path/to/main.db?replica=master&slave=tcp://my.server.ip:1234” 

E in/lato di backup replica è necessario disporre di un'applicazione in esecuzione per ricevere gli aggiornamenti. Questa applicazione si aprirà la copia db utilizzando un URI come questo:

“file:/path/to/copy.db?replica=slave&bind=tcp://0.0.0.0:1234” 

per consentire al punto-in-Time Recovery dobbiamo aggiungere alcuni parametri per il nome del file URI, ad es .:

&pitr=on&pitr_limit=200M 

E ' può essere abilitato nel db principale come nel backup/replica.

E per attivare la crittografia (database e comunicazione) aggiungiamo qualcosa di simile:

&cipher=chacha20&key=your_key_here 
0

.backup è il modo migliore.

sqlite3 my_database .backup > my_database.back 

si può anche provare .dump, il dump del database in un formato di testo SQL, se la tabella specificato, solo scaricare le tabelle di corrispondenza come modello TABLE.

sqlite3 my_database .dump > my_database.back 
+0

Su SQLite 3.8.2, '.backup' non funziona come mostrato sopra (" argomento FILENAME mancante su .backup ") –

Problemi correlati