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?
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?
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.
Puoi fare tutto in una riga ... 'sqlite3 m_database.sq3" .backup m_database.sq3.bak "' –
@Googie: Possiamo usarlo per la replica? oppure – mOna
@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
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();
}
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
.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
Su SQLite 3.8.2, '.backup' non funziona come mostrato sopra (" argomento FILENAME mancante su .backup ") –
[SQLite ha un'API per questo] (http://sqlite.org/backup.html) –
Che lingua e il driver stai usando per accedere al database? –
sto usando PHP e l'estensione PDO – thelolcat