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.
fuente
Respuestas:
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 ... TEMPLATE
funcionalidad? Después de la prueba, tira esa base de datos. Entonces su restricción de velocidad es esencialmente solo el tiempo paracp -R
el 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.fuente
Usa Stellar , es como git para bases de datos:
fuente
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).
fuente
Probablemente no sea la respuesta que espera, pero ¿ha considerado algún nivel inferior de instantáneas, por ejemplo, LVM?
fuente
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:
fuente
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.
fuente
Aunque tengo que decir que el
Stellar
ygit reset --hard
es una solución interesante, voy a tener un problema con las bases de datos y las pruebas más grandes, y hacer uso de lasVirtualbox
etc. 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
ZFS
como un sistema de archivos a tener en cuenta para estos en el futuro por las siguientes razones que @Peter Eisentraut también mencionó:para hacer una prueba, justo antes de la prueba, haga una parada postgresql como se indicó anteriormente,
zfs snapshot $SNAPSHOT
inicie la postgresql, luego retroceda, pare la postgresql y simplementezfs rollback $SNAPSHOT
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;)
fuente