[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法

[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。齋藤です。

現在僕たちのチームでは、Spring Bootを使ったアプリケーションを使っています。 僕はアップデートおじさんとして、アプリケーションで使っているライブラリのアップデートを日々行っています。

その中で使っているDBのマイグレーションのライブラリである、Flyway 今日は3分で分かる、Flywayのバージョンアップについて記事にしておきます。

はじめに

BOMを見たところ、Spring Boot 1.5.14において、テストされているflywayのバージョンは 3.2.1です。

しかし、Flywayの最新はFlyway 5.1.3です。 また、Spring Boot 2.x系の最新である、2.0.3では5.0.7が使われています

試しにSpring Bootを2系にしてバージョンアップしたところマイグレーションをしたところ DBのマイグレーションが失敗しました。

今回はこのFlyway 3.2.1とSpring Bootで作ったアプリケーションにおいて Flywayのバージョンアップをどうするかについて説明します。

方法

今回の方法は非常に簡単です。

  • Flywayのバージョンをひとまず、4.2.0にアップデートして、マイグレーションを実行する
  • Spring Bootのapplication.propertiesにFlywayの設定を追加する
  • Flywayのバージョンを5.1.3にアップデートする

Flywayのバージョンアップが出来たら Spring Bootのアップデートも出来そうやなガッハッハ!! というわけで、アップデートしていきます。

前提条件

参考に実際やってみた環境条件を示しておきます。

$ java -version
java version "1.8.0_161"
Java(TM) SE Runtime Environment (build 1.8.0_161-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.161-b12, mixed mode)

$ mysql --version
mysql  Ver 14.14 Distrib 5.7.20, for osx10.13 (x86_64) using  EditLine wrapper

$ ./gradlew bootRun
------------------------------------------------------------
Gradle 4.6
------------------------------------------------------------

Build time:   2018-02-28 13:36:36 UTC
Revision:     8fa6ce7945b640e6168488e4417f9bb96e4ab46c

Groovy:       2.4.12
Ant:          Apache Ant(TM) version 1.9.9 compiled on February 2 2017
JVM:          1.8.0_161 (Oracle Corporation 25.161-b12)
OS:           Mac OS X 10.13.5 x86_64

Spring Bootのバージョンは 1.5.10.RELEASE を使いました。

やってみる

それではやってみましょう。今回はgradle bootRunで試しました。

まずは mysqlの設定周りをよしなにしてから gradle bootRunでアップデートを試します。

まずは起動してマイグレーションを走らせます。

走らせました。

$ gradle bootRun # ひとまず、3系のアプリケーションを起動してみる。
...
2018-06-29 18:38:59.001  INFO 48666 --- [  restartedMain] c.g.wreulicke.simple.SimpleApplication   : Started SimpleApplication in 14.732 seconds (JVM running for 15.473)

Databaseのマイグレーションが実行されていることでしょう。

Flyway 4系にあげてみる

Flywayのバージョンを4系に上げて起動してみましょう。 ここでは4.2.0にしてみます。

おや・・・?

$ gradle bootRun 
2018-06-29 20:11:16.005  INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl  : Upgrading metadata table `test`.`schema_version` to the Flyway 4.0 format ...
2018-06-29 20:11:16.275  INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl  : Repairing metadata for version 1 (Description: create initial tables, Checksum: -523004839)  ...
2018-06-29 20:11:16.276  INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl  : Repairing metadata for version 2 (Description: create products, Checksum: 2082022939)  ...
2018-06-29 20:11:16.278  INFO 62409 --- [ost-startStop-1] o.f.c.i.metadatatable.MetaDataTableImpl  : Repairing metadata for version 3 (Description: create social connections, Checksum: -2006730467)  ...
2018-06-29 20:11:16.279  INFO 62409 --- [ost-startStop-1] org.flywaydb.core.Flyway                 : Metadata table schema_version successfully upgraded to the Flyway 4.0 format.
...
2018-06-29 20:11:23.327  INFO 62409 --- [  restartedMain] c.g.wreulicke.simple.SimpleApplication   : Started SimpleApplication in 16.435 seconds (JVM running for 17.259)

自動でmetadataを Flyway 4系向けにアップデートしてくれそうです!!

次は 5系にあげてみる

今回は試しに5系にアップデートするのですが Flyway5系からはマイグレーションを実行した情報を保存するテーブルが変わっています。

Flyway 3系, 4系では schema_versionというテーブルに保存されていたマイグレーションの情報が Flyway 5系では flyway_schema_historyというテーブルに変わっています。

そのため、以下のような設定をSpring Bootのapplication.propertiesにしてやる必要があります。 設定をしておきます。

flyway.table=schema_version
# Spring Boot 2系では、spring.flyway.tableになります。

5.1.3にあげて起動してみます。

$ gradle bootRun
...
2018-06-29 20:13:15.055  INFO 62740 --- [  restartedMain] c.g.wreulicke.simple.SimpleApplication   : Started SimpleApplication in 14.769 seconds (JVM running for 15.748)

というわけで、手元で試したところ、動きました。

まとめ

今回は Flywayのバージョンアップについて調べてまとめておきました。 皆さんのFlyway/Spring Bootのアップデートにお役に立てると嬉しいです。

また、今回はFlywayをアップデートせずにSpring Bootのバージョンアップだけをする、という方法を試しませんでした。 どなたか、試して記事にしてもらえると面白いかもしれません。

それでは、また別の記事でお会いしましょう。齋藤でした。

おまけで、いくつか試行錯誤したログを書いておきます。

これでアップデートの目処が立ってきましたよ!! 僕と一緒に Spring Bootを使ったアプリケーションのバージョンアップをやってみたい、という方は こちらから 待ってます!!!

おまけ なんとなく 3 --> 5 に移行しようとしてみた

ちなみに、最初はSpring Bootの設定をせずに Flywayを3系から5系になんとなく上げてみました。

$ gradle bootRun
Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration version 1
-> Applied to database : -1362686682
-> Resolved locally    : -523004839
        at org.flywaydb.core.Flyway.doValidate(Flyway.java:1037) ~[flyway-core-5.1.3.jar:na]
        at org.flywaydb.core.Flyway.access$100(Flyway.java:78) ~[flyway-core-5.1.3.jar:na]
        at org.flywaydb.core.Flyway$1.execute(Flyway.java:918) ~[flyway-core-5.1.3.jar:na]
        at org.flywaydb.core.Flyway$1.execute(Flyway.java:910) ~[flyway-core-5.1.3.jar:na]
        at org.flywaydb.core.Flyway.execute(Flyway.java:1238) ~[flyway-core-5.1.3.jar:na]
        at org.flywaydb.core.Flyway.migrate(Flyway.java:910) ~[flyway-core-5.1.3.jar:na]
        at org.springframework.boot.autoconfigure.flyway.FlywayMigrationInitializer.afterPropertiesSet(FlywayMigrationInitializer.java:66) ~[spring-boot-autoconfigure-1.5.10.RELEASE.jar:1.5.10.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1687) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1624) ~[spring-beans-4.3.14.RELEASE.jar:4.3.14.RELEASE]
        ... 92 common frames omitted

ファイルは変えてないのにマイグレーションのチェックサムの差分が出てしまっています。 これは、Flywayのバージョンアップでチェックサムの計算方法が変わったのでしょうか? というわけでこんなエラーが出ましたよ、という話でした。

おまけ flyway.tableを指定しなかった時

flyway.tableを指定しなかった場合はどうなるんでしょうか。 答えはここです。

フォールバックの機能があるみたいなんですが、Flyway6系で削除されるようです。 ちゃんと自分で指定しておいたほうが良さそうですね。

2018-06-29 20:13:08.460  WARN 62740 --- [ost-startStop-1] o.f.c.i.s.JdbcTableSchemaHistory         : Could not find schema history table `test`.`flyway_schema_history`, but found `test`.`schema_version` instead. You are seeing this message because Flyway changed its default for flyway.table in version 5.0.0 to flyway_schema_history and you are still relying on the old default (schema_version). Set flyway.table=schema_version in your configuration to fix this. This fallback mechanism will be removed in Flyway 6.0.0.

参考