Como fazer backup do banco de dados sqlite?

93

Qual é a maneira correta de fazer isso? Devo apenas copiar o arquivo .sq3?

E se houver usuários no site e o arquivo estiver sendo gravado enquanto está sendo copiado?

Thelolcat
fonte
6
SQLite tem uma API para isso
Coronel Trinta e Dois
1
Qual idioma e driver você está usando para acessar o banco de dados?
CL.
1
Estou usando PHP e a extensão PDO
thelolcat
Atualmente, há uma solicitação de recurso para expor a API de backup sqlite em php: bugs.php.net/bug.php?id=70950
Brian Minton

Respostas:

152

A ferramenta de linha de comando sqlite3 apresenta o .backupcomando dot .

Você pode se conectar ao seu banco de dados com:

sqlite3 my_database.sq3

e execute o comando backup dot com:

.backup backup_file.sq3

Em vez da conexão interativa com o banco de dados, você também pode fazer o backup e fechar a conexão depois com

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

De qualquer maneira, o resultado é uma cópia nomeada backup_file.sq3do banco de dados my_database.sq3.

É diferente da cópia regular de arquivos, porque cuida de todos os usuários que estão trabalhando no banco de dados. Existem bloqueios adequados definidos no banco de dados, portanto, o backup é feito exclusivamente.

Googie
fonte
68
Você pode fazer tudo em uma linha ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell
@Googie: Podemos usá-lo para replicação? ou
segunda
4
@mOna: Este é apenas um mecanismo para fazer backups. Replicação significa propagar mudanças em tempo real (uma espécie de banco de dados distribuído), o que isso não fará por você.
Googie
Obrigado pela resposta :)
mOna,
1
@RonJohn Na verdade, faz uma cópia de um arquivo, mas também garante que o acesso de gravação ao banco de dados seja restrito com os bloqueios apropriados, portanto, é uma operação atômica, sem modificações intermediárias.
Googie
5

.backup é a melhor maneira.

sqlite3 my_database .backup my_database.back

você também pode tentar o comando .dump, ele oferece a capacidade de despejar todo o banco de dados ou tabelas em um arquivo de texto. Se TABLE for especificado, apenas despeja tabelas que correspondem ao padrão LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Uma boa maneira de fazer uma cópia de arquivo usando dump and store, reconstruir o banco de dados posteriormente.

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

Verifique também esta questão Os comandos SQLite3 .backup e .dump bloqueiam o banco de dados?

Lava Sangeetham
fonte
4
No SQLite 3.8.2, .backupnão funciona como mostrado acima ("argumento FILENAME ausente em .backup")
Francesc Rosas
4
Esta é a melhor resposta. Se você estiver usando .backup em um banco de dados de trabalho usado por muitos, pode não funcionar porque em algum ponto o banco de dados está bloqueado. Então se você estiver usando isso em um CRON não vai funcionar e não vai te dizer que há um erro ... melhor usar .dump (sempre funciona) ou a API fornecida pelo SQLite.
Memristor de
@Memristor Mas o .dump não bloqueia o banco de dados para outros? FWIW, eu preferiria um backup com falha (com e-mail para o administrador) a um serviço interrompido.
Torsten Bronger,
1
Corrija a sintaxe .backup em sua resposta. Não precisa do operador '>'
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
fonte
Você está sugerindo a cópia programática no nível do sistema de arquivos dos arquivos do banco de dados?
Andreas Tasoulas
4
1. Você nem mesmo diz que idioma é esse código. O OP disse que está usando PHP, mas parece ser um código java. 2. Você copia um arquivo byte por byte. Qual deve ser a vantagem de fazer isso? Java (e php) possuem métodos para copiar arquivos. Leia docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Isso não resolve o problema de que o banco de dados pode ser gravado enquanto você o copia.
Christopher K.