Utilizamos algo similar a bcwoord para mantener nuestros esquemas de base de datos sincronizados en 5 instalaciones diferentes (producción, puesta en escena y algunas instalaciones de desarrollo), y respaldados en el control de versiones, y funciona bastante bien. Voy a elaborar un poco:
Para sincronizar la estructura de la base de datos, tenemos un solo script, update.php, y varios archivos numerados 1.sql, 2.sql, 3.sql, etc. El script usa una tabla adicional para almacenar el número de versión actual del base de datos. Los archivos N.sql están diseñados a mano, para pasar de la versión (N-1) a la versión N de la base de datos.
Se pueden usar para agregar tablas, agregar columnas, migrar datos de un formato de columna antiguo a uno nuevo y luego soltar la columna, insertar filas de datos "maestros" como tipos de usuario, etc. Básicamente, puede hacer cualquier cosa y con los datos adecuados guiones de migración que nunca perderá datos.
El script de actualización funciona así:
- Conéctese a la base de datos.
- Haga una copia de seguridad de la base de datos actual (porque las cosas saldrán mal) [mysqldump].
- Cree una tabla de contabilidad (llamada _meta) si no existe.
- Lea la VERSIÓN actual de la tabla _meta. Suponga 0 si no se encuentra.
- Para todos los archivos .sql con un número superior a VERSION, ejecútelos en orden
- Si uno de los archivos produjo un error: regrese a la copia de seguridad
- De lo contrario, actualice la versión en la tabla de contabilidad al archivo .sql más alto ejecutado.
Todo pasa al control de la fuente, y cada instalación tiene un script para actualizar a la última versión con una sola ejecución del script (llamando a update.php con la contraseña de la base de datos adecuada, etc.). Actualizamos los entornos de producción y puesta en escena de SVN a través de un script que llama automáticamente al script de actualización de la base de datos, por lo que una actualización de código viene con las actualizaciones necesarias de la base de datos.
También podemos usar el mismo script para recrear toda la base de datos desde cero; simplemente soltamos y recreamos la base de datos, luego ejecutamos el script que repoblará completamente la base de datos. También podemos usar el script para llenar una base de datos vacía para pruebas automatizadas.
Tomó solo unas pocas horas configurar este sistema, es conceptualmente simple y todos obtienen el esquema de numeración de versiones, y ha sido invaluable para tener la capacidad de avanzar y evolucionar el diseño de la base de datos, sin tener que comunicar o ejecutar manualmente las modificaciones. en todas las bases de datos.
Sin embargo, ¡tenga cuidado al pegar consultas de phpMyAdmin! Esas consultas generadas generalmente incluyen el nombre de la base de datos, que definitivamente no desea, ya que romperá sus scripts. Algo así como CREATE TABLE mydb
. newtable
(...) fallará si la base de datos en el sistema no se llama mydb. Creamos un enlace SVN previo al comentario que no permitirá los archivos .sql que contengan la mydb
cadena, lo cual es una señal segura de que alguien copió / pegó de phpMyAdmin sin una verificación adecuada.