Marcio Cunha

Migraciones de Bases de Datos sin Interrupciones con Flyway

Aprende a actualizar esquemas de bases de datos en producción sin tiempo de inactividad utilizando Flyway y el patrón de refactorización expansión-contracción.

Marcio Cunha12 min
También disponible en:EnglishPortuguês
Resumen
  • La estrategia de expansión y contracción asegura que las versiones antiguas y nuevas de la aplicación coexistan durante los cambios.
  • Flyway gestiona el historial de forma determinista mediante scripts versionados aplicados en orden estricto.
  • Los cambios destructivos requieren que las columnas antiguas se mantengan temporalmente y se eliminen en despliegues futuros.
  • Probar las migraciones en un entorno de pruebas espejo evita sorpresas catastróficas en los servidores de producción.
  • La automatización del proceso elimina el error humano e integra la evolución de la base de datos directamente al pipeline.

El Desafío de Modificar la Estructura de Datos con el Sistema en Marcha

Imagina que necesitas cambiar el motor de un coche mientras va a 100 kilómetros por hora por la autopista. Esa es la sensación de alterar una base de datos en producción sin causar interrupciones a los usuarios. En ingeniería de software, llamamos a esto migración sin tiempo de inactividad o zero-downtime.

Cuando añadimos una columna obligatoria nueva o cambiamos el tipo de dato de una tabla con mucho tráfico, el sistema puede fallar al instante. Si la aplicación antigua intenta guardar datos sin la nueva columna, la base de datos rechazará la transacción. Para resolver este dilema, debemos separar el cambio estructural del cambio lógico en el código.

En la práctica, esto significa que no podemos hacerlo todo de golpe. El secreto es dividir la modificación en etapas seguras, permitiendo que la aplicación vieja y la nueva convivan en armonía durante un breve período. Es aquí donde las herramientas especializadas de control de versiones de bases de datos entran en juego, asegurando que el orden de los factores no altere el producto final.

Entendiendo el Rol de Flyway en el Control de Versiones

Flyway es una herramienta de código abierto que funciona como un control de versiones, similar a Git, pero enfocado exclusivamente en bases de datos relacionales. Lee scripts SQL o clases de Java organizados en una carpeta específica y los aplica a la base de datos de forma secuencial y controlada.

Cuando Flyway se ejecuta por primera vez, crea una tabla de control llamada flyway_schema_history. En esta tabla, registra qué archivos ya se ejecutaron, su contenido y si la operación tuvo éxito. En la práctica, esto evita que el mismo script se ejecute dos veces por error o que modificaciones no autorizadas pasen desapercibidas.

Para los equipos de desarrollo, Flyway elimina el dolor de cabeza de descubrir si la base de datos local tiene las mismas columnas que la de un compañero. Garantiza que cualquier entorno —ya sea el portátil del desarrollador, el servidor de pruebas o la producción en la nube— comparta exactamente la misma estructura de datos.

El Patrón de Refactorización por Expansión y Contracción

El concepto más importante para realizar migraciones sin caídas es la estrategia conocida como Expand and Contract, o expansión y contracción. En lugar de renombrar o borrar una columna directamente, dividimos el proceso en tres fases distintas: expandir, migrar y contraer.

Durante la fase de expansión, alteramos la base de datos para introducir elementos nuevos —como una columna adicional— sin eliminar los anteriores. La aplicación actual sigue funcionando perfectamente porque los campos heredados continúan ahí, mientras la nueva versión del código ya sabe rellenar el nuevo espacio cuando es necesario.

Una vez que todo el código en producción ha sido actualizado para usar la nueva estructura, pasamos a migrar los datos históricos si es preciso. Finalmente, en la fase de contracción, eliminamos los elementos antiguos que ya no se usan. Este ciclo garantiza que ningún usuario note inestabilidad.

Ejemplo Práctico: Reemplazar una Columna con Seguridad

Supongamos que necesitamos cambiar una columna nombre_completo por dos separadas: nombre y apellido. Si hacemos esto con un comando simple en una tabla gigante, la base de datos puede bloquearse durante minutos u horas, generando una caída del servicio.

Primero, creamos un script en Flyway, como V1__agregar_nuevas_columnas.sql, que añade nombre y apellido como opcionales. La aplicación se actualiza para leer y escribir en ambos formatos a la vez, asegurando la compatibilidad hacia atrás con el sistema anterior.

ALTER TABLE usuarios ADD COLUMN nombre VARCHAR(100);
ALTER TABLE usuarios ADD COLUMN apellido VARCHAR(100);

Luego, ejecutamos un script de migración para dividir el nombre antiguo en los nuevos campos para los registros existentes. Solo tras confirmar que todo funciona y que la aplicación antigua se retiró por completo, creamos un último script para borrar la columna vieja.

Manejo de Errores Comunes y Bloqueos de Bases de Datos

Las bases de datos relacionales bloquean tablas o filas según la operación ejecutada. Un comando de alteración en tablas con decenas de millones de registros puede congelar todas las consultas de lectura y escritura, provocando un apagón operativo.

Para evitar esta trampa, debemos conocer los límites de rendimiento de nuestro motor de base de datos. Añadir una columna que acepte nulos suele ser rápido en motores modernos, mientras que cambiar el tipo de dato de una columna existente exige crear una nueva y copiar los datos por lotes.

Otra precaución esencial es nunca agrupar múltiples cambios complejos en un solo archivo de migración de Flyway. Cuanto más pequeño y aislado sea el cambio, más fácil será identificar el problema si algo sale mal durante la ejecución en producción.

Consideraciones Finales sobre Despliegues Continuos

Gestionar migraciones de bases de datos sin interrupciones exige un cambio de mentalidad en el equipo de ingeniería. La base de datos deja de ser una caja negra intocable y pasa a tratarse como código versionado, probado e integrado en el ciclo de entrega continua de software.

Al combinar la robustez de Flyway con el patrón de expansión y contracción, logramos evolucionar sistemas complejos con total tranquilidad. La disciplina en las migraciones garantiza que la innovación tecnológica ocurra tras bambalinas, sin afectar jamás la experiencia del usuario final.