Adam Szydłowski
Adam Szydłowski

Reputation: 51

Flyway repeatable migrations - executed before versioned ones?

I'm observing some strange Flyway behaviour when using repeatable migrations. Documentation states, that:

Within a single migration run, repeatable migrations are always applied last, after all pending versioned migrations have been executed.

but in my case it seems, that the repeatable migration (which is recreating one of the DB views) is failing because it is being executed before versioned migrations.

Flyway info data, from before migration: +-------------------+---------------------+---------------------+---------+ | Version | Description | Installed on | State | +-------------------+---------------------+---------------------+---------+ | 1 | Initial | | <Baseln | | 2 | ███████████████████ | | <Baseln | | 5 | Initial data | | <Baseln | | 6 | Initial sample data | 2016-04-29 14:21:13 | Success | | 20160422002600000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | 20160422003400000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | 20160422004700000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | 20160428152800000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | 20160428163300000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | 20160428171300000 | ███████████████████ | 2016-04-29 14:33:48 | Success | | | ProblematicView | 2016-04-29 14:33:48 | Outdate | | | Reports | 2016-04-29 14:33:49 | Success | | | OtherView | 2016-04-29 14:33:49 | Success | | 20160429115100000 | ███████████████████ | 2016-04-29 14:37:10 | Success | | 20160429160100000 | ███████████████████ | 2016-05-16 11:54:24 | Success | | 20160501090500000 | ███████████████████ | 2016-05-16 11:54:24 | Success | | 20160504111600000 | ███████████████████ | 2016-05-16 11:54:24 | Success | | 20160504120400000 | ███████████████████ | 2016-05-16 11:54:24 | Success | | 20160504143800000 | ███████████████████ | 2016-05-16 11:54:24 | Success | | 20160504145200000 | ███████████████████ | 2016-05-16 11:54:25 | Success | | 20160504161600000 | ███████████████████ | | Pending | | 20160506110300000 | ███████████████████ | | Pending | | 20160506162300000 | ███████████████████ | | Pending | | 20160506232000000 | ███████████████████ | | Pending | | 20160508144100000 | ███████████████████ | | Pending | | 20160509192400000 | ███████████████████ | | Pending | | 20160511160000000 | ███████████████████ | | Pending | | 20160511163659000 | ███████████████████ | | Pending | | 20160511163700000 | A newly_created_col | | Pending | | 20160511170000000 | ███████████████████ | | Pending | | 20160512112100000 | ███████████████████ | | Pending | | 20160512170500000 | ███████████████████ | | Pending | | 20160513134900000 | ███████████████████ | | Pending | +-------------------+---------------------+-------------------------------+

and the migration log:

[INFO] Database: jdbc:sqlserver://█:1433;authenticationScheme=nativeAuthentication;xopenStates=false;sendTimeAsDatetime=true;trustServerCertificate=false;sendStringParametersAsUnicode=true;selectMethod=direct;responseBuffering=adaptive;packetSize=8000;multiSubnetFailover=false;loginTimeout=15;lockTimeout=-1;lastUpdateCount=true;encrypt=false;disableStatementPooling=true;databaseName=█;applicationName=Microsoft JDBC Driver for SQL Server;applicationIntent=readwrite; (Microsoft SQL Server 11.0)
[INFO] Successfully validated 33 migrations (execution time 00:00.052s)
[INFO] SQLServer does not support setting the schema for the current session. Default schema NOT changed to dbo
[INFO] Current version of schema [dbo]: 20160504145200000
[WARNING] outOfOrder mode is active. Migration of schema [dbo] may not be reproducible.
[INFO] Migrating schema [dbo] with repeatable migration ProblematicView
[ERROR] Migration of schema [dbo] with repeatable migration ProblematicView failed! Changes successfully rolled back.
[INFO] SQLServer does not support setting the schema for the current session. Default schema NOT changed to dbo
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 3.550s
[INFO] Finished at: Mon May 16 12:40:49 CEST 2016
[INFO] Final Memory: 10M/243M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.flywaydb:flyway-maven-plugin:4.0.1:migrate (migrate-¦) on project ¦-db: org.flywaydb.core.internal.dbsupport.FlywaySqlScriptException:
[ERROR] Migration R__ProblematicView.sql failed
[ERROR] ------------------------------------------------
[ERROR] SQL State  : S0001
[ERROR] Error Code : 207
[ERROR] Message    : Invalid column name 'newly_created_column'. /*<-- column created in V20160511163700000*/`

Am I doing something wrong?
I'm using flyway-maven-plugin 4.0.1 (tested also on 4.0) with the following properties:

Maven:
<cleanDisabled>true</cleanDisabled>
<outOfOrder>true</outOfOrder>
<table>schema_version</table>
<repeatableSqlMigrationPrefix>R</repeatableSqlMigrationPrefix>
<sqlMigrationPrefix>V</sqlMigrationPrefix>
Config file:
flyway.user=flyway
flyway.password=█
flyway.url=jdbc:sqlserver://█;databasename=█
flyway.locations=filesystem:flyway/upgrade/█`

//EDIT1:

  1. When outOfOrder is set to false the migration is still failing,
  2. clean + migrate seem to work, but that doesn't quite solve the problem,
  3. I've noticed one more thing - when I've rolled back the DB to version 20160504143800000 repeatable migrations are shown at the end of the list (flyway info), but when 20160504145200000 migration is successfully executed suddenly they're in the middle of it (as in the table above). I'm not sure though if this has anything to do with the actual execution order.

Upvotes: 2

Views: 2339

Answers (2)

Adam Szydłowski
Adam Szydłowski

Reputation: 51

It turned out to be a bug in Flyway: LINK - it affects releases 4.0 - 4.0.2 and has been fixed in 4.0.3 (Release notes).

I can confirm that now it works as expected both on empty and existing databases.

Upvotes: 3

Roger Thomas
Roger Thomas

Reputation: 855

It would be worth you changing the outOfOrder property to false so that migrations can only happen in their defined order.

If you are still seeing a problem, can you also set cleanDisabled to false so that the schema is totally rebuilt and report what you see.

Both of the above cause flyway to work in a more certain way and so allow other people to be more certain about the order of events are commenting on.

Upvotes: 0

Related Questions