2010-11-23 20 views
22

Hoy tuve esta idea genial para hacer una copia de seguridad de mi base de datos: poner el archivo de volcado en un repositorio de git y luego confirmarlo en cada volcado para que tenga la copia más reciente pero pueda retroceder fácilmente a cualquier copia de seguridad anterior. También puedo obtener fácilmente una copia del repositorio de forma regular para mantener una copia en mi propia computadora como copia de seguridad de las copias de seguridad. Definitivamente suena ingenioso.¿Es viable manejar copias de seguridad de MySQL con git?

Sin embargo, soy consciente de que las soluciones inteligentes a veces tienen fallas fundamentales. ¿Qué tipo de problemas puedo llegar a almacenar mysqldump diffs en git? ¿Vale la pena? ¿Qué hace la mayoría de la gente para tener múltiples copias de seguridad de bases de datos en el servidor y mantener copias redundantes en otro lugar?

+0

Eso es básicamente lo que hizo mi última tienda, con CVS. –

+0

Es posible que desee consultar el RDS de Amazon (http://aws.amazon.com/rds/), tiene una herramienta de instantánea incremental que es útil para las copias de seguridad (a S3 no menos). –

Respuesta

6

Este enfoque me parece bien. Uso Git para hacer una copia de seguridad de mis propios datos importantes.

Tenga en cuenta que no está almacenando diffs: Git almacena de manera efectiva las instantáneas del estado del directorio con cada confirmación. Puede generar el diff de dos commits, pero el mecanismo de almacenamiento real no tiene nada que ver con diff.

+0

En realidad, paquetes de git tipo de tienda diffs de objetos, o deltas, si lo prefiere, de una manera muy eficiente :) – user1338062

+0

@ user1338062 Lo hará, pero no suele ser automáticamente, a menos que el repositorio crezca lo suficiente. – cdhowie

12

Normalmente, no conserva todas las copias de seguridad (o instantáneas) para siempre. Un repositorio de git hace guarda cada registro que hayas realizado. Si alguna vez decide eliminar las revisiones antiguas (digamos revisiones de un mes a una vez por semana, de un año a una vez al mes, etc.) tendrá que hacerlo con git filter-branch, que reescribirá todo el historial. Luego, git gc para eliminar las revisiones no deseadas.

Teniendo en cuenta que las fortalezas de git son el control de versiones distribuidas y los flujos de trabajo de parche/ramificación complejos (ninguno de los cuales se aplica a instantáneas o copias de seguridad) consideraría usar un VCS diferente con un historial más maleable.

+1

Este es un buen punto. Si desea mantener el historial de su base de datos * para siempre *, Git lo hará. Nuestra tienda, por ejemplo, hace botaderos diarios pero solo guarda los últimos 7 días, mientras mantiene tiraderos semanales para siempre. – erjiang

+0

Me interesaría almacenar una instantánea de MySQL en puntos clave del flujo de trabajo. Por ejemplo, al desarrollar en mi cuadro de desarrollo local, podría tener sentido tomar una instantánea de MySQL cuando introduzco el código en un repositorio central (que, por construcción, sería coherente con el código). ¿Alguna idea sobre eso? –

+0

@ChristianNally: las instantáneas de una base de datos configurada pero vacía como un medio de documentación o un atajo para desarrolladores tendría mucho sentido. Creo que la pregunta original era sobre la creación de una base de datos * completa *. –

3

En teoría, esto funcionará, pero comenzará a tener problemas cuando los volcados de la base de datos se agranden.

Git no tiene ningún límite de tamaño de archivo, pero diferirá el contenido de su último volcado con el almacenado previamente en el repositorio, que requerirá al menos tanta memoria como los tamaños de ambos archivos sumados, así que me imagino que comenzará a ser muy lento, muy rápido con archivos de más de 100 MB (o incluso 10 MB).

Git no está hecho para tratar con archivos de este tipo (es decir, archivos de big data en lugar de código fuente), así que creo que esto es fundamentalmente una mala idea. Sin embargo, podría usar algo como Dropbox para almacenar los volcados, lo que le permitirá guardar el historial de versiones, pero está más adaptado a los archivos que no se pueden diferir efectivamente.

+0

-1 Git no almacena confirmaciones como diffs. Como su argumento se basa en esta premisa, no es válido. – cdhowie

+3

No afirmó git stores commits como diffs. Simplemente afirmó que git _does_ realiza un diff cada vez que presiona, por ejemplo - Y estas operaciones serán lentas y consumirán grandes cantidades de memoria en archivos como este. –

+0

El texto * "diferirá el contenido de su último volcado con el almacenado previamente en el repositorio" * indica claramente que significa almacenamiento, no transferencia, ya que de lo contrario habría mencionado que presionar múltiples compromisos sería más eficiente que empujar uno a la vez. Entiendo lo que intenta decir, pero debido a la compresión delta, esto realmente no es muy preciso. Tengo volcados de datos aquí donde cada compromiso representa aproximadamente 1.2-1.7MB de datos, con 123 confirmaciones, y el repositorio es de 532KB. Recuerde que las confirmaciones también se comprimen en delta contra sí mismas, no solo las confirmaciones previas. – cdhowie

1

Si está utilizando MySQL (y posiblemente otros) y tiene habilitado el registro binario, puede considerar configurar un repositorio git para el directorio de su registro bin y desarrollar una estrategia para confirmar las actualizaciones regularmente en el binlog.

En MySQL, el binlog almacena las consultas que cambian los datos a cualquier tabla en la base de datos. Si sincroniza sus confirmaciones con volcados regulares de la base de datos, debe tener una forma versionada para restaurar los datos.

Honestamente, creo que simplemente usar las herramientas nativas de MySQL probablemente sea una mejor solución, pero lo que he esbozado aquí te permite versionar tus datos de MySQL, que es lo que creo que estabas buscando en primer lugar.

Cuestiones relacionadas