Pregunta

¿Cuál es la mejor manera de salvar mi modelo de datos MySQL y aplicar automáticamente los cambios en mi servidor de base de datos de desarrollo a medida que se hacen (o al menos las noches)?

Por ejemplo, hoy en día estoy trabajando en mi proyecto y crear esta tabla en mi base de datos, y guardar la declaración de archivo SQL para implementar en la producción posterior:

create table dog (
  uid int,
  name varchar(50)
);

Y mañana, decido que quiero para registrar la raza de cada perro también. Así que cambio el archivo SQL para leer:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Ese guión trabajará en la producción de la primera versión, pero no va a ayudarme a actualizar mi base de datos de desarrollo debido a ERROR 1050 (42S01): Table 'dog' already exists. Por otra parte, no va a trabajar en la producción si este cambio se hizo después de la primera versión. Así que realmente necesito ALTER la mesa ahora.

Así que ahora tengo dos preocupaciones:

  1. ¿Es así como yo debería estar ahorrando mi modelo de datos (un manojo de crear declaraciones en un archivo SQL), y
  2. ¿Cómo debería estar aplicando cambios como esto a mi base de datos?

Mi objetivo es dar a conocer los cambios de forma precisa y permitir la integración continua. Yo uso una herramienta llamada DDLSYNC no encontrar y aplicar diferencia en una base de datos Oracle, pero no estoy seguro de lo que existen herramientas similares para MySQL.

¿Fue útil?

Solución

En el trabajo, hemos desarrollado un pequeño script para gestionar nuestra base de datos de control de versiones. Cada cambio a cualquier mesa o conjunto de datos recibe su propio archivo de SQL.

Los archivos se numeran secuencialmente. Realizamos un seguimiento de los archivos de actualización se hayan dirigido por almacenar esa información en la base de datos. La secuencia de comandos inserta una fila con el nombre del archivo cuando el archivo está a punto de ser ejecutado, y actualiza la fila con una marca de tiempo cuando termina la finalización de ejecución. Esto se envuelve dentro de una transacción. (Vale la pena recordar que los comandos DDL en MySQL no pueden ocurrir dentro de una transacción. Cualquier intento de realizar DDL en una transacción hace que cometa un implícito.)

Debido a que los archivos SQL son parte de nuestro repositorio de código fuente, podemos hacer que ejecuta el script de actualización parte del proceso de despliegue normal. Esto hace que mantener la base de datos y el código de sincronización muy fácil. Honestamente, la parte más difícil es asegurarse de otra dev no ha agarrado el siguiente número en una pendiente de confirmación.

combinar este sistema con una actualización (opcional) limpie las noches de nuestra base de datos dev, sustituyendo el contenido de la copia de seguridad del sistema en vivo de la noche anterior. Después de la copia de seguridad se restablece, la actualización se ejecute, con los archivos de actualización en espera de ser atropellados en el proceso.

La restauración se produce de tal manera que sólo las tablas que estaban en la base de datos activa se sobreescriben. Cualquier actualización que agrega una tabla, por tanto, también tiene que ser responsable de sólo el agregarlo si no existe. DROP TABLE IF EXISTS es práctico. Por desgracia, no todas las bases de apoyo que, por lo que el sistema de actualización también permite la ejecución de scripts escritos en nuestro idioma de su elección, no sólo SQL.

Todo esto en aproximadamente 150 líneas de código. Es tan fácil como leer un directorio, comparando el contenido de una tabla, y ejecutar cualquier cosa que no haya sido ya ejecutada, en un orden determinado.

Otros consejos

Existen herramientas estándar para esto en muchos marcos: Carriles tiene algo que se llama Migraciones , algo que es fácilmente replicable en PHP o cualquier lenguaje similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top