2011-02-10 21 views
37

migraciones MyBatis divide cada archivo SQL en dos secciones:¿Cómo revertir migraciones utilizando Flyway?

  1. Uno para migrar hacia adelante una versión
  2. Uno para la migración de una versión posterior

¿Cómo versiones uno lograr la regresión del uso de Flyway?

+0

DOH, yo esperaba algo bajo como: la forma de rollo de Rick :) – bestsss

Respuesta

67

encontrado la respuesta en el FAQ:

¿Qué pasa con las secuencias de comandos de downgrade/migraciones hacia abajo?

Flyway NO es compatible con los scripts de downgrade.

Si bien la idea de los scripts de degradación (popularizados por Rails Migrations) es buena en teoría, desafortunadamente se rompe en la práctica. Tan pronto como tenga cambios destructivos (soltar, eliminar, truncar, ...), comenzará a tener problemas. E incluso si no lo hace, terminará creando alternativas caseras para restaurar copias de seguridad, que también deben probarse adecuadamente.

Los scripts de degradación suponen que no se pudo completar la migración.

Una migración puede fallar en cualquier momento. Si tiene 10 afirmaciones, es posible que el 1º, el 5º, el 7º o el 10º fallen. Simplemente no hay forma de saber de antemano. Los guiones de bajada se escriben para revertir una migración completa. Esto los hace inútiles, incluso para cambios no destructivos.

Mantiene la compatibilidad con versiones anteriores entre el DB y todas las versiones del código actualmente implementado en producción.

De esta forma, una migración fallida no es un desastre. La versión anterior de la aplicación todavía es compatible con la base de datos, por lo que puede simplemente retrotraer el código de la aplicación, investigar y tomar medidas correctivas.

Una solución mucho mejor es una estrategia adecuada y bien probada de copia de seguridad y restauración.

Es independiente de la estructura de la base de datos, y una vez probado y comprobado que funciona, ningún script de migración puede romperlo. Para un rendimiento óptimo, y si su infraestructura lo admite, recomendamos utilizar la tecnología de instantáneas de su solución de almacenamiento subyacente. Especialmente para volúmenes de datos más grandes, esto puede ser varios órdenes de magnitud más rápido que las copias de seguridad y restauraciones tradicionales.

+6

Su mejor opción es, por supuesto, utilizar una base de datos que soporta adecuadamente las transacciones DDL, como PostgreSQL. De esta manera, la base de datos se encargará de limpiar el problema por usted. –

+8

Has entendido mal el punto de mi pregunta. No estoy diciendo que me gustaría retroceder en el medio de una transacción en caso de falla. Estoy diciendo que un cliente tiene la versión 4 de la base de datos y quiero retrotraerlo a la versión 2. – Gili

+0

¿Cuál sería el uso en la vida real en el que uno quisiera retrotraer migraciones exitosas múltiples en un sistema de producción? –

0

Supongo que necesita una estrategia de reversión, cuando p. Ej. un socio falla en la etapa de producción y su implementación es esencial para su lanzamiento.

puede nombrar a su scripts SQL vías migratorias como los siguientes:
V < YourReleaseNumber> .000_ Descripción <>.sql

Ahora usted puede dejar
V < YourReleaseNumber> .998_rollback.sql para la restitución
y hacer V < YourReleaseNumber> .999_reenroll.sql reinscribirse.

En su entorno de CI/CD necesita 2 trabajos más (activados manualmente) después de su trabajo de implementación. Uno para reversión, que ejecuta el proceso de reversión, incluida la migración de rutas migratorias. Otro para volver a inscribirse.
Solo tiene que preocuparse por la configuración del objetivo en la ruta de vuelo.
Para su trabajo de implementación de su objetivo debe ser < YourReleaseNumber> 0.997
para su trabajo de deshacer < YourReleaseNumber> 0.998

Al iniciar un nuevo lanzamiento, asegúrese de que no se ejecute la secuencia de deshacer/reinscribirse de el viejo lanzamiento.

Como se dijo antes, una buena solución de respaldo y restauración es la solución recomendada.

(sry por mala Inglés)

0

he encontrado la mejor manera de hacer esto es simplemente limpiar la base de datos limpia y migrar hacia adelante a la versión específica que quería volver a.

Como las preguntas frecuentes sugieren que los scripts de retrotracción son buenos en teoría, pero algunas migraciones simplemente no se pueden deshacer. (por ejemplo, si se descarta una tabla, restaurar la tabla DDL es fácil, pero restaurar los datos que contiene puede ser difícil.)

1

Esto es compatible desde Flyway 5.0. Lamentablemente, es solo una característica comercial.

https://flywaydb.org/documentation/command/undo

+0

Dado que las advertencias mencionadas en https://stackoverflow.com/a/4959332/14731 aún se aplican, esto no te lleva muy lejos. Aún así, es bueno saber que esto fue agregado. Quizás encuentren una manera de eliminar algunas de estas limitaciones en el futuro. – Gili

+0

Esas advertencias fueron revisadas en la última versión. Consulte la [confirmación] relevante (https://github.com/flyway/flywaydb.org/commit/25e1f01ca6effb1c508bd98c5e6a0fe4cef0172a#diff-83eadbf6287db7b4b054d30b5dae6394). – user2248785

Cuestiones relacionadas