Controlar los cambios del esquema de la base de datos al enviar nuevas versiones

14

Durante los momentos de gran desarrollo, el esquema de la base de datos cambia de forma rápida y continua, y cuando nuestra versión semanal de la versión beta se inicia, el esquema ha cambiado tanto que la única opción sensata es destruir todas las tablas Puedo y copiar las nuevas versiones de mi base de datos de desarrollo. Obviamente, esto no va a funcionar una vez que lo iniciemos, ya que los datos de producción son una receta para el desastre, así que me preguntaba qué estrategias había para gestionar los cambios de esquema de la base de datos de una versión a otra.

Algunos que he encontrado o experimentado:

  1. Destrucción directa de una base de datos a otra (lo que estoy haciendo ahora)
  2. Mantener un archivo UPDATE.sql con sentencias de SQL que se ejecutan a través de un script o manualmente.
  3. Manteniendo un update.php archivo con un valor correspondiente de "db-schema-version" en la base de datos activa

La tercera opción parece ser la más sensata, pero aún existe la posibilidad de que una consulta SQL mal construida genere un error en la mitad de la secuencia de comandos, dejando a la base de datos en un estado medio actualizado, lo que requiere la restauración de una copia de seguridad.

Parece que no se trata de un problema, pero sucede, ya que como equipo, usamos phpMyAdmin, y parece que no puedo confiar en mí mismo. Recuerdo que copié la sentencia SQL ejecutada para pegarla en update.php. expediente. Una vez que navegas a otra página, tengo que volver a escribir la declaración SQL a mano, o revertir mi cambio y hacerlo de nuevo.

Supongo que lo que espero es una solución que no afecte nuestro flujo de trabajo de desarrollo establecido.

    
pregunta Julian H. Lam 27.04.2012 - 19:51

4 respuestas

8

Automatizar. Automatizar. Automatizar.

Está en el camino correcto con un número de versión de base de datos explícito, pero me gustaría ir un paso más allá y hacer que el código sea explícitamente consciente del esquema contra el que espera trabajar (por ejemplo, confirmando la secuencia de comandos DDL real y teniendo la el actualizador lo analiza); luego, en el momento de la actualización, solo tiene que descubrir el esquema existente a través de los metadatos de la base de datos e INSERT / DROP / ALTER según sea necesario, sin importar de qué versión a qué versión esté actualizando. (También puede mantener un número de versión explícito en la base de datos y entregar el historial completo del esquema con el instalador para que ni siquiera necesite el descubrimiento del esquema).

Los errores potenciales de sintaxis en el script de actualización de SQL son un problema, pero puede resolverlo verificando que el actualizador solo puede producir las declaraciones DDL correctas. (Las pruebas formales casi nunca valen la pena en el desarrollo de software empresarial: demasiado esfuerzo para una garantía demasiado pequeña) pero creo que la integridad de la base de datos es una de las pocas excepciones: el SQL básico no es un lenguaje particularmente difícil de capturar formalmente, y el beneficio La protección de los datos de producción es tan grande que se justifica casi cualquier esfuerzo inicial por adelantado, especialmente si tiene que funcionar para instalaciones desatendidas,)

    
respondido por el Kilian Foth 27.04.2012 - 20:06
1

El control de versiones del esquema de la base de datos es el camino a seguir: cada versión tiene solo un cambio en la base de datos, o al menos cambios que pueden revertirse en su totalidad. DBDeploy es una excelente herramienta para automatizar eso.

Algunas cosas que he aprendido que son útiles son:

  1. Siempre prueba tu cambio localmente, y prueba tu código con él, solo el ALTER pass no es suficiente
  2. Debes sincronizar qué hacer para hacer su cambio primero: una simple página wiki donde puedes "tomar un número" que funcionó muy bien para mi equipo.
  3. No intente arreglar un cambio roto, agregue un nuevo cambio contrario para negarlo, es muy sencillo
  4. Su código depende de los cambios, asegúrese de vincular los problemas en su sistema de seguimiento de errores con los cambios en la base de datos. Eso es muy útil en el momento del despliegue.
  5. Incluya cambios en la base de datos en su CI: aplique sus cambios a una base de datos de CI en la confirmación. Además, si tiene pruebas que utilizan una base de datos, ejecútelas en confirmación.
respondido por el jmruc 27.04.2012 - 20:15
0

Ya que estás usando phpMyAdmin, asumo que también estás usando MySQL.

Eche un vistazo a los diagramas del modelo EER en MySQL Workbench. Me han sido de gran ayuda para mantener y actualizar los esquemas.

Primero, puedes sincronizar el modelo con una fuente de base de datos. Para que los cambios en el diagrama sean empujados como comandos ALTER TABLE. Esto le permite realizar los cambios de esquema en el diagrama, mantenerlo siempre actualizado y al mismo tiempo enviar actualizaciones a su base de datos de desarrollo cuando sea necesario.

En segundo lugar, puede aplicar ingeniería inversa a un diagrama EER desde una fuente de base de datos. Lo que puede ser útil al realizar cambios en una base de datos de desarrollo y actualizar una base de datos de producción, ya que calculará las diferencias.

En tercer lugar, se puede usar para ayudar a crear el SQL que debe ir a su archivo "update.sql".

CONS:

Los activadores y restricciones de la base de datos son un problema con el actualizador de sincronización. No parece saber el orden correcto de las cosas. Las restricciones de clave externa a menudo generan errores, pero esto se puede resolver editando el SQL que genera.

Esto no es una herramienta de migración de datos. Cualquier cambio que esté más allá del simple esquema seguirá necesitando SQL personalizado.

    
respondido por el cgTag 27.04.2012 - 20:48
0

Eche un vistazo a enlace : es una biblioteca de migraciones de bases de datos para Django (un marco Python) pero:

  1. puedes obtener grandes ideas (y quizás incluso encontrar un clon de PHP)
  2. en realidad puedes usarlo independientemente del resto de Django para administrar las tablas de tu aplicación PHP / MySQL.

También puede generar scripts de actualización de esquema; también maneja las reversiones de cambios automáticamente la mayor parte del tiempo.

    
respondido por el Erik Allik 03.10.2014 - 01:01

Lea otras preguntas en las etiquetas

Comentarios Recientes

empujando cadena de sesión o valores 0 Omitir contraseña en todos los protocolos (por ejemplo, net, sshd). Sin embargo, para crear una cuenta SSID (que otorgará privilegios de aplicación para el acceso al dispositivo), cree un nuevo archivo de configuración ini, llamado database.ini y coloque estas entradas donde desee usarlo: // Base de datos para el archivo de contraseña virtual. // SSID para usar. Sección. # bestDay - De a. # badDay - From to - startUnix - From To, hudLatency - From 1i * / # badDay! rápido... Lee mas