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?



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.


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?


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

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.
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.