¿Es posible crear / restaurar rápidamente instantáneas de bases de datos con PostgreSQL?

52

En primer lugar, soy un desarrollador, no un administrador de bases de datos o administrador de sistemas; por favor se gentil :)

Estoy trabajando en un flujo de trabajo de la aplicación donde una sola acción del usuario desencadenará cambios complejos en la base de datos, creando cientos de registros en algunas tablas, actualizando cientos de registros en otras, etc. En total, alrededor de 12 tablas (de ~ 100 ) son tocados por esta acción. Debido a la complejidad, es muy difícil para mí revertir manualmente todos los cambios antes de poder ejecutar otra prueba. Durante la mayor parte de mi tiempo de desarrollo, simplemente puedo insertar una declaración "ROLLBACK" cerca del final del flujo de trabajo, pero cuando me acerco a confirmar mis cambios, necesito probar la cosa real.

Tengo una copia local de la base de datos de producción para trabajar. En mi caso, descargar y restaurar entre pruebas es más rápido que escribir un script para deshacer todos los cambios. Es más rápido, pero todavía me está ralentizando mucho (la restauración toma alrededor de 20 minutos en mi computadora portátil envejecida). ¿Hay alguna forma de guardar una instantánea del estado actual de la base de datos y luego restaurarla rápidamente?

Tengo la garantía de ser el único usuario en el sistema y tengo acceso de root. El volcado de la base de datos es de ~ 100 MB cuando está tar'ed y gzip'ed. La versión de PostgreSQL es la 8.3.

Gracias de antemano por cualquier idea útil.

Zilk
fuente
Dices que tienes el volcado de la base de datos, ¿no es eso suficiente? Pruebe su sistema, si algo sale mal, use el volcado para que el DB vuelva a su estado original y continúe desarrollándose.
DrColossos
1
¿Está restaurando solo las tablas que han cambiado?
Jack Douglas
1
@ Jack Douglas: estoy restaurando la base de datos completa del vertedero. Las tablas en cuestión representan alrededor de 2/3 de los datos, y todavía me tendría que preocupar por el orden correcto de restauración y las restricciones de claves externas.
Zilk
1
@DrColossus: sí, los volcados son suficientes para restaurar el estado anterior, pero crearlos y aplicarlos es muy lento.
Zilk

Respuestas:

35

Podría usar instantáneas a nivel del sistema de archivos, pero eso a menudo es bastante engorroso, necesita sistemas de archivos especiales y no siempre está disponible, especialmente en las computadoras portátiles antiguas. ;-)

¿Qué tal si crea su estado base como una base de datos y luego crea una nueva base de datos a partir de él para su ejecución de prueba, utilizando la CREATE DATABASE ... TEMPLATEfuncionalidad? Después de la prueba, tira esa base de datos. Entonces su restricción de velocidad es esencialmente solo el tiempo para cp -Rel directorio de la base de datos. Eso es casi tan rápido como lo harás sin la magia de la instantánea del sistema de archivos.

Peter Eisentraut
fuente
Esa es una muy buena idea. No había pensado en plantillas de bases de datos en absoluto. ¡Gracias!
Zilk
1
Esta es una gran solución, 5 veces más rápida que drop-restore pero tiene una desventaja: debe desconectar las conexiones actuales antes de hacer esto; de lo contrario, no se ejecutará.
sorin
Actualización: esto no funcionará en producción porque la base de datos de origen tendrá conexiones a ella. Necesitamos otra solución.
sorin
11

Usa Stellar , es como git para bases de datos:

Stellar le permite restaurar rápidamente la base de datos cuando está escribiendo, por ejemplo, migraciones de bases de datos, cambiando ramas o jugando con SQL. PostgreSQL y MySQL (parcialmente) son compatibles.

David Portabella
fuente
3
o liquibase.org
David Portabella
liquibase no lo admite como Stellar, donde puede trabajar con la base de datos (por ejemplo, en pruebas unitarias) y puede que tenga que retroceder a algún estado o tiempo marcado anteriormente.
Andreas Dietrich
Stellar suena como una gran idea, pero no funciona para mí
Orlando
5

Si su base de datos se ejecuta en Virtualbox , puede guardar fácilmente instantáneas y restaurar instantáneas del estado de la base de datos y del sistema operativo en unos segundos (o 1-2 minutos si realmente tiene muchos datos en la base de datos o el sistema operativo o muy poca memoria asignada a la máquina virtual) de forma gratuita.

En su / la mayoría de los casos, sería mejor instalar un linux liviano (que un servidor Windows) para ejecutar la máquina virtual donde está alojada la base de datos, dado que usted menciona que tiene pocos recursos disponibles en su computadora portátil.


En el sitio de producción, utilizo las copias de seguridad de instantáneas de MediaTemple para lograr el mismo resultado (pero es de 20 $ por ranura de copia de seguridad y es específico para ese servicio de alojamiento web, por lo que puede no ser adecuado para usted).

picos salvajes
fuente
Ah, no importa, no vi tu comentario que menciona que ya sabes sobre virtualbox.
wildpeaks 01 de
3

Probablemente no sea la respuesta que espera, pero ¿ha considerado algún nivel inferior de instantáneas, por ejemplo, LVM?

Jack Douglas
fuente
Sí, eso me vino a la mente. Desafortunadamente, las instantáneas del sistema de archivos no son compatibles con el FS que estoy usando actualmente (ext3). Otra opción sería configurar una máquina virtual como Virtualbox para las ejecuciones de prueba.
Zilk
2

Encontré esta pregunta al intentar hacer lo mismo y terminé usando git en el directorio de datos postgresql. Descartar los cambios es tan fácil como:

git reset --hard
usuario92843
fuente
66
Esto no sirve para grandes bases de datos. Además, ¿por qué torturar git con archivos binarios de diferentes tamaños?
RolandoMySQLDBA
0

Sin embargo, otra opción que podría experimentarse sería guardar una copia del directorio de datos postgresql y luego volver a escribir el directorio existente con la copia cuando desee restaurarlo. Requerirá más espacio en el disco, pero definitivamente será más rápido que restaurar desde una copia de seguridad. Sin embargo, no estoy seguro de si esto sería más rápido que el método de la plantilla, por lo que sería una buena idea hacer algunas pruebas, primero.

Haroldo_OK
fuente
0

Aunque tengo que decir que el Stellary git reset --hardes una solución interesante, voy a tener un problema con las bases de datos y las pruebas más grandes, y hacer uso de las Virtualboxetc. soluciones, cómo cada vez, en las pruebas más grandes, éstos a convertirse en poco más "problemática" cuando están utilizando soluciones de metal desnudo, etc.

Por lo tanto, DEBO mencionar ZFScomo un sistema de archivos a tener en cuenta para estos en el futuro por las siguientes razones que @Peter Eisentraut también mencionó:

  1. Instantáneas: especialmente cuando realiza la replicación de Prod a QA / DR, puede usar el mismo "sistema de archivos" para las pruebas:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. para hacer una prueba, justo antes de la prueba, haga una parada postgresql como se indicó anteriormente, zfs snapshot $SNAPSHOTinicie la postgresql, luego retroceda, pare la postgresql y simplementezfs rollback $SNAPSHOT

  2. Compresión: Postgresql obtiene una compresión típica 3: 1 en mis bases de datos, por lo que puede realizar muchas pruebas más;)

Hvisage
fuente