Skip to content

Latest commit

 

History

History
72 lines (47 loc) · 2.72 KB

FLYWAY.md

File metadata and controls

72 lines (47 loc) · 2.72 KB

Go Back

Flyway - Database Migrations

Click to see details of `Migrations have failed validation`

Unresolved dependency

mvn clean spring-boot:run can fail errors such as Validate failed: Migrations have failed validation if the previous run of mvn clean spring-boot:run had resulted in failed migrations, as flyway would have made an entry in the flyway_schema_history; db table.

And then we see the following error when we run the mvn clean spring-boot:run command next time.

Click here for errors
ERROR org.springframework.boot.SpringApplication.reportFailure - Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined 
in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: 
Validate failed: Migrations have failed validation
Detected failed migration to version 001 (create baseline).
Please remove any half-completed changes then run repair to fix the schema history.

Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
Detected failed migration to version 001 (create baseline).
Please remove any half-completed changes then run repair to fix the schema history.

Fix

flyway clearly telling us to repair the failed migrations in the logs. There are few ways to handle this issue, including both the manual and automated solutions. But let's focus on the automated solution for now using flyway callbacks as we don't want manual intervention.

We could consider an approach to automatically clean the failed entries from the flyway_schema_history after a failed migration. For this purpose, we can use the afterMigrateError Flyway callback.

Let's first create the SQL callback file db/callback/afterMigrateError__repair.sql:

DELETE FROM flyway_schema_history WHERE success=false;

This will automatically remove any failed entry from the Flyway state history, whenever a migration error occurs.

But to make flyway find and execute this script, we have to add it to the path like below:

spring.flyway.locations=classpath:db/migration,classpath:db/callback

Although it can be added to some existing properties file, but, we'll add it to a new application-flyway-callback.properties and activate this new flyway-callback spring profile.

flyway-callback spring profile should be activated only when the flyway spring profile is also activated.

Go Back