2019年12月30日
Spring Boot2系にあげたときにやったことをまとめようと思います。(関連記事) 今回は、Flywayの話です。バージョンアップ後のSpring Bootのバージョンは2.0.9.RELEASEです。2.2対応はまたいつか書きます。
Flywayは、データベースマイグレーションライブラリです。 Spring Bootとの連携も簡単にできます。詳しくは、コチラを読んでください。
Spring Boot 1.5.22のFlywayのバージョンは3.2.1
でしたが、Spring Boot 2.0.9では、5.0.7
とメジャーバージョンが2つも上がりました。ちなみにSpring Boot 2.2.2では6.0.8になっています。
まずカジュアルに3.x -> 5.xにあげてみましたが、マイグレーションが失敗しました...。
2019-09-11 03:43:15.152 ERROR --- Application startup 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]: Invocation of init method failed; nested exception is org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration 1
-> Applied to database : 1750005324
-> Resolved locally : -558371367
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1583)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:296)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1076)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:851)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:761)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:371)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:315)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1186)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1175)
at com.b1a9idps.sample.view.Application.main(Application.java:19)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:58)
Caused by: org.flywaydb.core.api.FlywayException: Validate failed: Migration checksum mismatch for migration 1
調べてみたら3 -> 4
、4 -> 5
で大きな変更が入っていました。
● 3 -> 4
チェックサム計算時に、改行コードを無視するようになりました。つまり、チェックサムの計算方法が4系から変更になりました。背景等は、[コチラ](<https://flywaydb.org/blog/flyway-4.0>)
● 4 -> 5
Flywayのメタデータを管理するテーブル名が `schema_version` から `flyway_schema_history` に変更になりました。詳しくは、[コチラ](<https://github.com/flyway/flyway/issues/1848>)
Flyway3 -> 5にするときの方法はちゃんとリリースノートに書いてありました。
Important note for users upgrading from Flyway 3.x: This release no longer supports a schema history table upgrade from Flyway 3.x. You must upgrade to Flyway 4.2.0 first before upgrading to Flyway 5.0.0.
Spring Boot 1.5.xのFlywayを4.2.0
に上げます。
dependencies {
compile "org.flywaydb:flyway-core:4.2.0"
}
起動します。
$ gradle bootRun
2019-09-11 03:43:14.467 INFO --- Upgrading metadata table `sample`.`schema_version` to the Flyway 4.0 format ...
2019-09-11 03:43:15.329 INFO --- Repairing metadata for version 1 (Description: CREATE TABLE SAMPLE DATA, Checksum: -558371367) ...
2019-09-11 03:43:15.349 INFO --- Repairing metadata for version 2 (Description: MODIFY SAMPLE DATA LENGTH, Checksum: -1031537806) ...
2019-09-11 03:43:15.370 INFO --- Repairing metadata for version 3 (Description: SAMPLE DATA ADD INDEX, Checksum: 194652164) ...
2019-09-11 03:43:15.412 INFO --- Metadata table schema_version successfully upgraded to the Flyway 4.0 format.
初回起動時に、既存のメタデータを管理しているテーブルを自動的でアップデートしてくれました。