Me costó mucho tratar de encontrar buenos ejemplos de cómo administrar esquemas de bases de datos y datos entre servidores de 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 sandbox personal para hacer lo que quieran. Actualmente, los desarrolladores realizarán un cambio en el esquema SQL y realizarán un volcado de la base de datos en un archivo de texto que comprometerán 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". La implementación en el servidor de prueba es actualmente un proceso muy manual, y generalmente implica que cargue el último SQL de SVN y lo modifique. Además, los datos en el servidor de prueba son inconsistentes. Terminas con los datos de prueba que el último desarrollador que confirmó tenía en su servidor sandbox.
Donde todo se rompe 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 ser realmente complicado.
Si el problema fuera solo el esquema, sería un problema más fácil, pero hay datos "básicos" en la base de datos que también se actualizan durante el desarrollo, como metadatos en las tablas de seguridad y permisos.
Esta es la barrera más grande que veo para avanzar hacia la integración continua y la construcción en un solo paso. ¿Cómo se soluciona esto?
Una pregunta de seguimiento: ¿cómo realiza un seguimiento de las versiones de la base de datos para saber qué scripts ejecutar para actualizar una instancia de base de datos determinada? ¿Una tabla de versiones como Lance menciona debajo del procedimiento estándar?
Gracias por la referencia a Tarantino. No estoy en un entorno .NET, pero su página wiki de DataBaseChangeMangement me pareció muy útil. Especialmente esta presentación de PowerPoint (.ppt)
Voy a escribir un script de Python que verifica los nombres de los *.sql
scripts en un directorio dado contra una tabla en la base de datos y ejecuta los que no están allí en orden en función de un número entero que forma 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. Se encarga de inicializar la base de datos si no existe y ejecuta scripts de actualización según sea necesario. También hay conmutadores para borrar una base de datos existente e importar datos de prueba de un archivo. Son alrededor de 200 líneas, por lo que no lo publicaré (aunque podría ponerlo en pastebin si hay interés).