¿Cómo hacer una copia de seguridad de la base de datos sqlite?

93

¿Cuál es la forma correcta de hacerlo? ¿Simplemente copio el archivo .sq3?

¿Qué sucede si hay usuarios en el sitio y se está escribiendo el archivo mientras se copia?

thelolcat
fuente
6
SQLite tiene una API para esto
coronel treinta y dos
1
¿Qué idioma y controlador está utilizando para acceder a la base de datos?
CL.
1
Estoy usando PHP y la extensión PDO
thelolcat
Actualmente hay una solicitud de función para exponer la API de respaldo sqlite en php: bugs.php.net/bug.php?id=70950
Brian Minton

Respuestas:

152

La herramienta de línea de comandos sqlite3 presenta el .backupcomando dot .

Puede conectarse a su base de datos con:

sqlite3 my_database.sq3

y ejecute el comando backup dot con:

.backup backup_file.sq3

En lugar de la conexión interactiva a la base de datos, también puede hacer la copia de seguridad y luego cerrar la conexión con

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

De cualquier manera, el resultado es una copia con el nombre backup_file.sq3de la base de datos my_database.sq3.

Es diferente de la copia de archivos regular, porque se ocupa de cualquier usuario que esté trabajando actualmente en la base de datos. Hay bloqueos adecuados establecidos en la base de datos, por lo que la copia de seguridad se realiza exclusivamente.

Googie
fuente
68
Puedes hacerlo todo en una sola línea ...sqlite3 m_database.sq3 ".backup m_database.sq3.bak"
Mark Setchell
@Googie: ¿Podemos usarlo para la replicación? o
lunes
4
@mOna: este es solo un mecanismo para realizar copias de seguridad. La replicación significa propagar los cambios sobre la marcha (una especie de base de datos distribuida), lo que no es suficiente para usted.
Googie
Gracias por la respuesta :)
mOna
1
@RonJohn Realmente hace una copia de un archivo, pero también asegura que el acceso de escritura a la base de datos está restringido con los bloqueos adecuados, por lo que es una operación atómica, sin modificaciones intermedias.
Googie
5

.backup es la mejor manera.

sqlite3 my_database .backup my_database.back

También puede probar el comando .dump, que le da la posibilidad de volcar la base de datos completa o tablas en un archivo de texto. Si se especifica TABLE, solo volcar tablas que coincidan con el patrón LIKE TABLE.

sqlite3 my_database .dump > my_database.back

Una buena forma de hacer una copia de archivo usando dump and store es reconstruir la base de datos más tarde.

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

También verifique esta pregunta ¿Los comandos SQLite3 .backup y .dump bloquean la base de datos?

Lava Sangeetham
fuente
4
En SQLite 3.8.2, .backupno funciona como se muestra arriba ("falta el argumento FILENAME en .backup")
Francesc Rosas
4
Esta es la mejor respuesta. Si está utilizando .backup en una base de datos en funcionamiento utilizada por muchos, es posible que no funcione porque en algún momento la base de datos está bloqueada. Entonces, si está usando esto en un CRON, no funcionará y no le dirá que hay un error ... mejor use .dump (siempre funciona) o la API proporcionada por SQLite.
Memristor
@Memristor ¿Pero no bloquea .dump la base de datos para otros? FWIW, preferiría una copia de seguridad fallida (con correo al administrador) a un servicio interrumpido.
Torsten Bronger
1
Corrija la sintaxis .backup en su respuesta. No necesita 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
fuente
¿Está insinuando la copia programática en el nivel del sistema de archivos de los archivos de la base de datos?
Andreas Tasoulas
4
1. Ni siquiera dices en qué idioma es este código. El OP dijo que está usando PHP, pero parece ser un código Java. 2. Copia un archivo byte a byte. ¿Cuál debería ser la ventaja de hacerlo? Java (y php) tienen métodos para copiar archivos. Lea docs.oracle.com/javase/tutorial/essential/io/copy.html 3. Esto no resuelve el problema en el que podría escribirse la base de datos mientras lo copia.
Christopher K.