He tenido dificultades para encontrar buenos ejemplos de cómo gestionar los esquemas de bases de datos y los datos entre los servidores de desarrollo, prueba y producción.¿Cómo administra las bases de datos en desarrollo, prueba y producción?
Aquí está nuestra configuración. Cada desarrollador tiene una máquina virtual que ejecuta nuestra aplicación y la base de datos MySQL. Es su caja de arena personal para hacer lo que quieran. Actualmente, los desarrolladores harán un cambio en el esquema de SQL y realizarán un volcado de la base de datos a un archivo de texto que se comprometerá en SVN.
Queremos implementar un servidor de desarrollo de integración continua que siempre ejecutará el último código comprometido. Si lo hacemos ahora, volverá a cargar la base de datos desde SVN para cada compilación.
Tenemos un servidor de prueba (virtual) que ejecuta "candidatos de lanzamiento". Implementar en el servidor de prueba es actualmente un proceso muy manual, y generalmente implica que cargue el SQL más reciente de SVN y lo ajuste. Además, los datos en el servidor de prueba son inconsistentes. Terminas con los datos de prueba que el último desarrollador haya tenido en su servidor de espacio aislado.
Donde todo se descompone es el despliegue a la producción. Como no podemos sobrescribir los datos en vivo con los datos de prueba, esto implica volver a crear manualmente todos los cambios de esquema. Si hubo una gran cantidad de cambios de esquema o scripts de conversión para manipular los datos, esto puede ponerse realmente complicado.
Si el problema era solo el esquema, sería un problema más fácil, pero también hay datos "base" en la base de datos que se actualizan durante el desarrollo, como los metadatos en las tablas de seguridad y permisos.
Esta es la mayor barrera que veo al avanzar hacia la integración continua y las compilaciones en un solo paso. ¿Cómo usted lo solucionó?
Un seguimiento pregunta: ¿cómo realizar un seguimiento de las versiones de bases de datos para que sepa qué secuencias de comandos a ejecutar para actualizar una instancia de base de datos dada? ¿Hay una tabla de versiones como Lance mencionada debajo del procedimiento estándar?
Gracias por la referencia a Tarantino. No estoy en un entorno .NET, pero encontré que su DataBaseChangeMangement wiki page fue muy útil. Especialmente este Powerpoint Presentation (.ppt)
Voy a escribir un script en Python que comprueba los nombres de *.sql
scripts en un directorio dado en una tabla en la base de datos y ejecuta los que no están presentes en el orden basado en un número entero de que las formas la primera parte del nombre de archivo. Si es una solución bastante simple, como sospecho que será, la publicaré aquí.
Tengo un script de trabajo para esto. Maneja la inicialización del DB si no existe y la ejecución de scripts de actualización según sea necesario. También hay interruptores para borrar una base de datos existente e importar datos de prueba de un archivo. Se trata de 200 líneas, por lo que no lo publicaré (aunque podría ponerlo en pastebin si hay interés).
Relevante: http: // stackoverflow.com/questions/52583/best-tool-for-synchronizing-mysql-databases –