¿Cuál es la forma más fácil y automática de actualizar la estructura de la base de datos MySQL de producción con la estructura de la base de datos de desarrollo, sin perder los datos de la aplicación?

La respuesta corta es ALTER TABLE (la respuesta detallada de Joe describe cómo se puede automatizar).

La respuesta más larga depende de cómo desee manejar las reversiones, porque los cambios de esquema (DDL) no son transaccionales en MySQL (lo son, en PostgreSQL). Por lo general, los cambios en el esquema y el código de la aplicación ocurren juntos: son interdependientes. Si encuentra un problema crítico al implementar un cambio (aunque debería esperarse que un proceso de “preparación” lo encontrara antes) entonces necesitaría la capacidad de retroceder en el cambio.

Los retrocesos se pueden manejar de varias maneras, desde menos a más sofisticados:

  • restaurar volcado (= tiempo de inactividad)
  • usar una instantánea del sistema de archivos (= menos tiempo de inactividad)
  • use ALTER TABLE para deshacer (más complicado, propenso a errores)
  • tener más de un servidor de aplicaciones y aislar una instancia de producción para probar el cambio hacia adelante. Esto también tiene una gran ventaja, ya que algunos cambios en línea afectan al servidor o son muy lentos, como agregar índices. La reversión no afecta la producción, simplemente bote y reconstruya las instancias de prueba. (Esto es esencialmente un proceso de “puesta en escena” si la instancia de prueba no está expuesta al mundo).
  • etc.

También hay esto, pero aún no lo he estudiado. http://www.slideshare.net/jonoxe…

Siguiendo con la respuesta de Toby Thain; Esto es lo que hacemos en BuildFax:

Reglas : sin eliminación de columnas; sin cambios en las definiciones de índice (en su lugar, haga un nuevo índice con un nombre diferente); eliminación manual de índices; no hay cambios en las definiciones de columna que destruirían los datos dentro de la columna con ALTER TABLE MODIFY

La actualización de la estructura de la tabla en la producción desde el desarrollo es la siguiente:

  1. Iterar a través de todas las tablas sobre desarrollo; para cada mesa:
  2. Obtenga la sintaxis SHOW CREATE TABLE
  3. Vea si tal tabla existe en producción; si no, ejecute CREATE TABLE usando la instrucción en # 2
  4. Si no existe, ejecute SHOW CREATE TABLE en la misma tabla en producción
  5. Compare las dos salidas; el resultado predeterminado para SHOW CREATE TABLE divide las cosas en una columna por línea, lo que hace que la comparación sea bastante fácil
  6. Para cada columna que ha cambiado su definición, ejecutamos ALTER TABLE MODIFY
  7. Para cada columna que no existe en la producción, ejecutamos ALTER TABLE ADD y usamos la palabra clave AFTER, notando la columna que vino antes.
  8. (No hay otros casos para columnas, dadas las reglas anteriores, y ejecutamos solo una declaración a la vez)
  9. Para cada índice que no existe, ejecute ALTER TABLE ADD KEY (o ADD UNIQUE KEY o lo que esté en la instrucción SHOW CREATE TABLE)
  10. (No hay otros casos para índices, dadas las reglas anteriores)

He trabajado en entornos donde una sola llamada a ALTER TABLE para agregar una columna o un índice en el entorno en vivo dejará el sitio sin respuesta durante mucho tiempo. Trabajé con un desarrollador agradable que creó e indexó en Live y dejó la mesa cerrada durante casi 3 horas.

No sé cuán complicados podrían ser los cambios que planeas hacer. La explicación que doy es válida en caso de que estés lidiando con muchos cambios o cambios realmente fuertes.

Actualizar la estructura de la tabla en vivo es una tarea difícil y debe estar muy preparado para hacerlo. Mi sugerencia es:

1-Crea una nueva tabla con la nueva estructura que te gustaría tener. Establezca el valor de incremento automático en el mismo número que tiene en la tabla real. Digamos que su tabla son usuarios, y el incremento automático está en 999, creará una tabla users_new y establecerá el incremento automático en 999.

2-Actualice la aplicación para escribir en ambas tablas. Esto se hace en la capa de base de datos de la aplicación, por lo que debe ser transparente. Ejemplo, en el método save () de su modelo de usuarios, debe escribir en ambas tablas al mismo tiempo.

3-Ponga la aplicación parcheada en vivo. En este momento, se crearán nuevos usuarios en ambas tablas con la misma ID. Los usuarios antiguos solo existirán en la tabla anterior. Las actualizaciones se ejecutarán en la tabla anterior y en la tabla nueva si el usuario existe.

4-Comienza lentamente a importar usuarios antiguos a la nueva tabla. Los usuarios antiguos serán aquellos con una identificación inferior a 999 en este ejemplo.

5-Cuando todos los usuarios fueron importados, tienes 2 fuentes de datos trabajando en paralelo, con la misma información exacta.

6-Ahora trabaje con seguridad en la nueva versión de la aplicación que considera la nueva estructura como la única fuente.

7-Cuando la aplicación esté lista, impleméntela para vivirla y ejecutarla en MySQL:

RENAME TABLE users TO users_old; usuarios_nuevos para los usuarios;

Esta operación atómica no requiere casi nada y se debe llamar en el momento del despliegue.

¡Hecho!

Esto es lo que haría, pero de nuevo, tengo en mente la complejidad de los sitios que administro, y no sé si el suyo será más o menos complicado; entonces la respuesta probablemente no sea la mejor para su caso.

More Interesting

¿Hay un mercado para SaaS privado?

¿Cuál es el enfoque recomendado para hacer una prueba de integración para microservicios?

¿Es una buena idea alojar una aplicación empresarial SaaS en PaaS?

¿Existe un servicio alojado para mi formulario de registro de SaaS?

¿Qué hace FreshBooks.com?

¿Existe algún software gratuito (o económico) de mesa de ayuda SaaS, fácil de implementar para una startup tecnológica con un pequeño equipo de mesa de ayuda de 4 agentes?

¿Qué pila de tecnología de ventas y marketing recomendaría para una empresa que busca prospectar negocios B2B SaaS con un modelo de negocio SMB, y por qué?

¿Cómo crean las nuevas empresas SaaS segmentos de clientes?

¿SMB SaaS es más difícil?

¿Cuáles son los beneficios de la herramienta de colaboración de proyectos basada en SaaS?

Cómo encontrar clientes para mi producto SaaS

¿Qué software de tablero es útil para rastrear métricas críticas para nuevas empresas? ¿Qué métricas rastrea? ¿Hace comparaciones históricas? Los sistemas de inteligencia empresarial como Jasper y Pentaho parecen excesivos. ¿Hay soluciones más livianas?

Estoy buscando una empresa para realizar auditorías y evaluaciones de seguridad para mi inicio de serie B SaaS. ¿Cuáles son algunas buenas opciones en Nueva York?

¿Debería usar un CMS para un contenido SaaS (páginas de destino, preguntas frecuentes, etc.) o deberíamos usar la aplicación para crear las páginas de contenido allí?

¿Cuál crees que es la mejor manera de convencer a los C-Suite de que necesitan redes sociales empresariales?