この記事は公開されてから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.