2011-10-07 8 views
6

Tengo una base de datos sqlite3 en algún sistema que necesito descargar durante la operación en curso. Detener o detener el proceso de acceso no es una opción. Por lo que entiendo esto, necesito mantener un bloqueo COMPARTIDO (como se describe en http://www.sqlite.org/lockingv3.html) en la base de datos durante la descarga para evitar cambios de db y daños durante la descarga. ¿Cómo obtengo explícitamente dicho bloqueo? La descarga se controla desde un programa C++, por lo que tendría que obtener el bloqueo allí.Bloqueo de sqlite3 db para descarga de archivos

EDITAR: thkala sugirió hacer un volcado de base de datos. Pero preferiría encontrar una solución con el bloqueo porque no estoy seguro de si habrá suficiente memoria disponible para una copia completa de la base de datos.

Respuesta

8

No, no. ¡no y no!

Enlazar con cerrojos y copiar archivos a mano es la forma antigua de hacer las cosas. SQLite ahora tiene un adecuado backup API que puede usar. Es la forma recomendada de realizar copias en línea de una base de datos SQLite; puede usarla para crear una copia de la base de datos, que luego se puede descargar a su conveniencia.

EDIT:

Si es absolutamente tiene de utilizar los bloqueos, puede utilizar el método descrito here - posiblemente después se traduce en C:

  • Abrir la base de datos

  • Uso la instrucción BEGIN IMMEDIATE para adquirir un bloqueo compartido.

  • Copie/descargue los archivos manualmente - asegúrese de no perder ninguno. Hay al menos el archivo DB, el archivo del diario y posiblemente el archivo WAL. Es posible que desee colocar el DB en un directorio separado para simplificar las cosas.

  • ROLLBACK transacción que acaba de iniciar.

que entender cómo este método podría ser útil en algunos casos, pero tengo que repetir que esto no es el método recomendado más.

+0

No sabía acerca de la API de copia de seguridad, ¡muy agradable! – RushPL

+0

El uso de la API de respaldo es un problema ya que no estoy seguro si tengo suficiente espacio disponible para hacer una copia completa de la base de datos. –

-3

La solución aquí es incorrecta, dejándola para la posteridad y para que la gente aprenda por qué es una mala idea.

Creo que también puede salirse con la suya al copiar la base de datos junto con el diario. (Copie db y journal en archivos tmp y luego descárguelos). Luego en el extremo remoto intente abrir este databse y se arreglará . Esto se proporciona siempre que la aplicación esté usando transacciones apropiadas.

Lea comentarios a continuación que explican por qué está mal:

El quid de la cuestión es, puede copiar la revista db &, pero sólo si podría conseguir tanto desde exactamente el mismo instante en el tiempo .

Que es más o menos imposible.

+3

¡NO! ¡NO! ¡NO! Esta es una * receta * para corrupción de datos. Los diarios DB requieren una semántica adecuada del sistema de archivos, lo cual NO SUCEDE cuando se copian archivos a través de una red. -1 – thkala

+0

Problema 1: en la Web, el archivo DB se pudo descargar en segundos o incluso * minutos * después/antes del diario – thkala

+0

No creo que esto funcione si hay acceso de escritura durante la copia. –

2

Yo como que se pasa por alto la solución: Iniciar una transacción con

BEGIN IMMEDIATE TRANSCTION 

y terminar con

END TRANSACTION 

para adquirir la cerradura. Las palabras clave IMMEDIATE no son las predeterminadas y el db ya está bloqueado (se ha reservado el bloqueo RESERVADO) cuando se devuelve la llamada.