¿Es una buena idea hacer una copia de seguridad de una base de datos MySQL en Git?

57

Estoy tratando de mejorar la situación de la copia de seguridad de mi aplicación. Tengo una aplicación Django y una base de datos MySQL. Leí un artículo que sugiere hacer una copia de seguridad de la base de datos en Git.

Por un lado, me gusta, ya que mantendrá una copia de los datos y el código sincronizados.

Pero Git está diseñado para el código, no para los datos. Como tal, hará un montón de trabajo adicional para diferenciar el volcado de MySQL en cada confirmación, lo que no es realmente necesario. Si comprimo el archivo antes de almacenarlo, ¿git todavía diferirá los archivos?

(El archivo de volcado está actualmente sin comprimir 100MB, 5.7MB cuando está comprimido).

Editar: el código y las definiciones del esquema de la base de datos ya están en Git, en realidad son los datos los que me preocupan hacer una copia de seguridad ahora.

wobbily_col
fuente
13
Si su empresa tiene un departamento de TI (operaciones), deberían estar manejando esto.
Michael Hampton
1
¿son los datos parte de la aplicación o qué se crea a través de la aplicación?
Winston Ewert
1
Git intentará diferenciar todos los archivos cuando lo ejecutes git gc(o es subyacente git repack; git, de forma predeterminada configurable, lo ejecutará de forma automática). También siempre los desinflará , por lo que podría ser mejor almacenarlos sin comprimir.
Jan Hudec
1
¿Qué tipo de base de datos es: es una base de datos de producción o desarrollo?
el.pescado
66
viget.com/extend/backup-your-database-in-git , él es un "desarrollador senior".
wobbily_col

Respuestas:

101

Antes de perder cualquier dato, permítame intentar presentar una perspectiva de administrador de sistemas a esta pregunta.

Solo hay una razón por la que creamos copias de seguridad: para hacer posible la restauración cuando algo sale mal, como siempre ocurrirá. Como tal, un sistema de respaldo adecuado tiene requisitos que van mucho más allá de lo que git puede manejar razonablemente.

Estos son algunos de los problemas que puedo prever al intentar hacer una copia de seguridad de su base de datos en git:

  • El repositorio crecerá dramáticamente con cada "copia de seguridad". Dado que git almacena objetos completos (aunque comprimidos) y luego los difunde más tarde (por ejemplo, cuando ejecuta git gc) , y mantiene el historial para siempre , tendrá una gran cantidad de datos almacenados que realmente no necesita ni desea. Es posible que deba limitar la cantidad o el período de retención de las copias de seguridad que realiza para ahorrar espacio en el disco o por razones legales, pero es difícil eliminar las revisiones anteriores de un repositorio git sin mucho daño colateral.
  • La restauración se limita a los puntos de tiempo que ha almacenado en el repositorio, y dado que los datos son tan grandes, retroceder más de una cantidad de tiempo trivial puede ser lento. Un sistema de copia de seguridad diseñado para este propósito limita la cantidad de datos almacenados mientras que potencialmente proporciona más granularidad, y proporciona restauraciones más rápidas, reduciendo el tiempo de inactividad en caso de desastre. Las soluciones de respaldo compatibles con la base de datos ( ejemplo ) también pueden proporcionar respaldo continuo , asegurando que no se pierda una sola transacción.
  • Es probable que los commits también sean lentos y se vuelvan más lentos a medida que crece la base de datos. Recuerde que git es esencialmente un almacén de datos de valores clave mapeado en un sistema de archivos y, por lo tanto, está sujeto a las características de rendimiento del sistema de archivos subyacente. Es posible que este período de tiempo exceda eventualmente el intervalo de respaldo, y en ese punto ya no puede cumplir con su SLA. Los sistemas de copia de seguridad adecuados también tardan más en hacer una copia de seguridad a medida que crecen los datos, pero no de manera tan dramática, ya que administrarán automáticamente su propio tamaño en función de la política de retención que haya configurado.

A pesar del hecho de que aparentemente hay varias cosas interesantes que puede hacer con un volcado de base de datos si lo coloca en git, en general no puedo recomendarlo con el propósito de mantener copias de seguridad. Especialmente porque los sistemas de respaldo están ampliamente disponibles (y muchos son incluso de código abierto) y funcionan mucho mejor para mantener sus datos seguros y hacer posible la recuperación lo más rápido posible.

Michael Hampton
fuente
Esta es la mejor respuesta, ya que Michael ha cubierto problemas de coherencia. Dependiendo del tamaño y el uso de la base de datos, una instantánea no puede reproducir de manera confiable los datos en un momento dado y es probable que tenga problemas de restricción. La replicación puede ser algo que desee ver en - dev.mysql.com/doc/refman/5.0/en/replication.html
Aaron Newton
44
Esta no es solo la mejor respuesta, es la única respuesta. Como regla general, usted es un desarrollador, por lo que las copias de seguridad no son su negocio; alguien más los está (o debería estar) cuidando de ellos, y si comienzas a involucrarte, puedes estar interfiriendo con un sistema que ya funciona. Estas cajas ya deberían estar respaldadas, por lo que tendrá una copia de seguridad, su propia copia de seguridad y una copia de seguridad de su propia copia de seguridad, todo con un tamaño cada vez mayor. Eso es una locura. Además: eres un desarrollador: ¿por qué (probablemente) te acercas a las cajas de producción de todos modos?
Maximus Minimus
2
@JimmyShelter Hay una escuela de pensamiento de que DevOps no significa que Dev y Ops trabajen juntos, sino que Dev realmente hace Ops. Por lo general, no funciona bien, pero eso no impide que las personas lo intenten.
Michael Hampton
Esta debería ser la respuesta aceptada. Explica claramente los requisitos y el propósito de un sistema de respaldo, luego muestra cómo git no encaja. Puntos de bonificación extra por discutir la consistencia y el rendimiento.
Gabriel Bauman
Permítanme comentar que publiqué mi respuesta asumiendo que el OP no tiene ningún equipo de Operaciones que pueda manejar este problema por él. Estoy de acuerdo con usted en que este tipo de tarea es mejor dejarla para aquellos que realmente están operando el sistema y conocen su camino. Pero hay situaciones en las que tienes que ponerte un sombrero que no es exactamente tuyo, y creo que en esa situación es mejor tratar de aprender algunas de las mejores prácticas que simplemente encontrar tu propia solución artificial. Debo decir que también he encontrado su respuesta muy instructiva.
logc
39

Mis dos centavos: no creo que sea una buena idea. GIT hace algo como "almacenar instantáneas de un conjunto de archivos en diferentes momentos", por lo que puede usar perfectamente GIT para algo así, pero eso no significa que deba hacerlo . GIT está diseñado para almacenar el código fuente, por lo que le faltaría la mayor parte de su funcionalidad y estaría intercambiando mucho rendimiento por solo un poco de conveniencia.

Permítame suponer que la razón principal por la que está pensando en esto es "mantener una copia de los datos y el código sincronizados", y que esto significa que le preocupa que la versión 2.0 de su código necesite un esquema de base de datos diferente a la versión 1.0 . Una solución más simple sería almacenar el esquema de la base de datos, como un conjunto de scripts SQL con CREATEdeclaraciones, a lo largo del código fuente en su repositorio Git. Luego, una parte de su procedimiento de instalación sería ejecutar esos scripts en un servidor de base de datos previamente instalado.

El contenido real de esas CREATEtablas just -d no tiene nada que ver con la versión de su código fuente. Imagine que instala su software, versión 1.0, en el servidor A y en el servidor B, que son utilizados en diferentes compañías por diferentes equipos. Después de algunas semanas, el contenido de las tablas será muy diferente, aunque los esquemas sean exactamente los mismos.

Como desea hacer una copia de seguridad del contenido de la base de datos, le sugiero que utilice un script de copia de seguridad que etiquete el volcado de copia de seguridad con la versión actual del software al que pertenece el volcado. El script debe estar en el repositorio GIT (para que tenga acceso a la cadena de versión del código fuente), pero los volcados en sí no pertenecen a un sistema de control de versiones.

EDITAR :

Después de leer la publicación original que motivó la pregunta , me parece una idea aún más dudosa. El punto clave es que el mysqldumpcomando transforma el estado actual de una base de datos en una serie de INSERTinstrucciones SQL , y GIT puede diferenciarlas para obtener solo las filas actualizadas de la tabla.

La mysqldumpparte es sólida, ya que este es uno de los métodos de copia de seguridad enumerados en la documentación de MySQL. La parte GIT es donde el autor no nota que los servidores de bases de datos mantienen un registro de transacciones para recuperarse de fallas, incluido MySQL . Está utilizando este registro , no GIT, que debe crear copias de seguridad incrementales para su base de datos. Esto tiene, ante todo, la ventaja de que puede rotar o vaciar los registros después de la recuperación, en lugar de hinchar un repositorio GIT en el infinito y más allá ...

logc
fuente
2
No estoy seguro de ver algún punto en el almacenamiento del esquema de la base de datos sin los datos en el control de versiones. Los datos son lo más importante, y eso es lo que quiero respaldar. Sin embargo, me gusta la idea de etiquetar la copia de seguridad de la base de datos con la versión actual del software. Intentaré implementar algo así.
wobbily_col
10
El punto de almacenar el esquema sin los datos es que, justo después de la instalación, su software debe estar "listo para ser usado". Si es un wiki, entonces debería estar listo para comenzar a crear páginas wiki y escribir algo en ellas. Si instala el esquema y el contenido, su wiki ya está lleno de páginas X wiki después de la instalación ... Eso no es exactamente "instalar un sistema wiki para escribir nuestro contenido", sino "copiar un wiki de algún lugar para leerlo". .
logc
3
Puede ser una buena idea modificar su pregunta con la situación real en la que se encuentra. Incluso si no puede publicar todos los detalles, sería importante indicar que necesita una gran cantidad de datos para que no se modifique en cada instalación, o hay una sola instalación ...
logc
2
@wobbily_col Un formato binario sin texto tiene un valor limitado en el contexto del control de origen. No puede diferenciarlo , no puede bifurcarlo / fusionarlo , etc. Por lo tanto, aunque ciertamente PUEDE usar git para almacenar la base de datos, la mayoría de las personas prefieren escribir la estructura de la base de datos y los datos necesarios. Es un compromiso entre tener un poco más de trabajo, pero proporcionar la lista de características anterior. Tendrá que sopesar si esta es una buena idea o no para su solución. De lo contrario, probablemente pueda hacer que GIT almacene la base de datos directamente, simplemente no es exactamente la mejor opción para la tarea.
Daniel B
3
@RaduMurzea: Creo que esta es una cuestión de principios. Un sistema de control de versiones está diseñado para administrar el código fuente, y no los binarios, eso es todo. No es una cuestión de tamaño. No, los volcados de la base de datos no deben registrarse en el repositorio, al igual que los videos de capacitación tampoco deben registrarse. Pero nadie te impide hacerlo. :)
logc
7

Personalmente, no creo que sea una buena idea usar un sistema de versión de control de origen para almacenar los archivos de copia de seguridad, porque el control de versión GIT está diseñado para archivos de datos, no para archivos binarios o archivos de volcado como un archivo de volcado de copia de seguridad MySQL. El hecho de que pueda hacerlo no significa automáticamente que deba hacerlo. Además, su repositorio, considerando una nueva copia de seguridad de la base de datos para cada nueva confirmación, crecerá drásticamente, utilizando mucho espacio en el disco duro y el rendimiento de GIT se verá afectado, resultando en un sistema de control de fuente lento. Para mí, está bien ejecutar una estrategia de respaldo y siempre he preparado un archivo de respaldo cuando necesita restaurar la base de datos cuando algo en su código falla, pero las herramientas de control de fuente no están hechas para almacenar datos binarios.

Por estas razones, no veo ninguna utilidad para almacenar los archivos de copia de seguridad para el día 1 y para el día 2, y luego ver las diferencias entre los dos archivos de copia de seguridad. Requerirá mucho trabajo extra e inútil. En lugar de usar GIT para almacenar copias de seguridad de la base de datos cuando confirma un nuevo código, almacene las copias de seguridad de la base de datos en una ruta diferente, separadas por fecha y hora, e inserte en su código alguna referencia a las nuevas copias de seguridad de la base de datos creadas para cada versión, usando las etiquetas, como alguien ya sugirió.

Mi nota final sobre las copias de seguridad de la base de datos y GIT: Un administrador de base de datos, cuando necesita restaurar una base de datos porque se han perdido algunos datos, no necesita verificar las diferencias entre el archivo de respaldo para el día 1 y el archivo de respaldo para el día 2, solo necesita saber cuál es el último archivo de respaldo que le permitirá restaurar la base de datos, sin ningún error y pérdida de datos, reduciendo el tiempo de inactividad. De hecho, la tarea de un administrador de base de datos es hacer que los datos estén disponibles para la recuperación lo antes posible, cuando el sistema, por alguna razón, falla. Si almacena las copias de seguridad de la base de datos en GIT, vinculadas a sus confirmaciones, no permite que el administrador de la base de datos restaure los datos rápidamente, porque sus copias de seguridad están limitadas a los puntos de tiempo que almacenó en el repositorio de GIT y para reducir el tiempo de inactividad del sistema,

Entonces, no recomiendo almacenar las copias de seguridad utilizando GIT, utilice en su lugar una buena solución de software de copia de seguridad (hay algunas de ellas aquí ), que proporcionará más granularidad y le permitirá mantener sus datos seguros y protegidos, y hacer que su Recuperación de datos simple y rápida en caso de desastres.

Alberto Solano
fuente
Tal vez el votante negativo explique por qué votó negativamente ...
Alberto Solano
1
No es el votante negativo, pero creo que este enfoque introduce un conflicto de fusión siempre presente que no es particularmente propicio para el flujo de trabajo de ramificación, fusión y frecuencia que la mayoría de los usuarios de git prefieren.
Daniel B
@DanielB Propongo no utilizar el sistema de control de versiones para almacenar los archivos de copia de seguridad de la base de datos. Creo que el problema de la copia de seguridad de la base de datos podría resolverse fácilmente sin usar ningún sistema de control de versiones. Los sistemas de control de versiones (GIT, TFS, SVN, etc.) están diseñados para software, no para volcar archivos o copias de seguridad de bases de datos o simplemente para almacenar datos (hay muchas soluciones para eso).
Alberto Solano
Creo que la mayoría de los usuarios leen las primeras oraciones y votan en contra, ya que parece que va a decir que está bien usarlo.
1
@AlbertoSolano ya veo; pero leyendo la pregunta ("¿puedo hacer una copia de seguridad de mi DB en GIT?") y luego su primera declaración ("está bien almacenar el archivo de copia de seguridad ..."), parece que está diciendo lo contrario. El resto de la respuesta parece estar diciendo que no es ni aquí ni allá, mientras que sospecho que la mayoría de la gente piensa que es un choque de trenes esperando que suceda.
Daniel B
1

No debe almacenar datos binarios en Git, especialmente en la base de datos.
Los cambios de código y los cambios de DML de la base de datos son cosas totalmente diferentes.

MySQL y Oracle pueden escribir registros de archivos con el propósito de restaurarlos en cualquier momento. Simplemente haga una copia de seguridad de esos registros en un lugar seguro y estará bien.

Usar Git para hacer una copia de seguridad de estos "registros de archivo" no tiene sentido. Los registros de archivo en entornos de producción son bastante pesados ​​y deben eliminarse después de realizar copias de seguridad completas regulares. También es inútil ponerlos en git, ya que en cierto sentido ya son un repositorio.

Jehy
fuente
1
¿Por qué uno no usaría Git para hacer una copia de seguridad de estos "registros de archivo" creados por MySQL?
mosquito
1
Solo porque no tiene sentido. Los registros de archivo en entornos de producción son bastante pesados ​​y deben eliminarse después de realizar copias de seguridad completas regulares. También es inútil ponerlos en git, ya que en cierto sentido ya son un repositorio. Michael Hampton da una respuesta bastante buena sobre este tema (en esta página).
Jehy
1
¿Por qué molestarse en los registros rotativos, si va a guardar una copia de todo en git? También podría mantener un archivo de registro de monstruo.
wobbily_col