2019/03/17

flyway を3.xから5.xにアップグレードするときは注意!

Spring Bootをアップグレードするとflywayもメジャーアップデートされる

Spring Boot 1.x EOL Aug 1st 2019 とあるように、Spring Boot 1.x のEOLは2019/8 なので、2.xにアップグレードする必要がある。

Spring Boot 2.0 Migration Guide · spring-projects/spring-boot Wiki · GitHub をみていたところ、Flywayを使っている場合、テーブル構造が変わるので一旦flyway 4.2.0 + Spring Boot 1.5.xの構成にするようにとあった。「じゃぁ」と始める前に、今どうなっているかをちゃんと確認しておこう。方法は2つある。いずれにせよ事前調査は重要だ。

flywayのversionをログで確認

ログを見れば起動時にflywayのVersionも表示されている。だけど、長い間動かしてきて、かつ、定期的にログを退避していると、起動時のログを見つけるのが大変だったりする。

flywayのテーブル構造でversion確認

変わるというテーブル構造を直接確認する。ログにある起動時のメッセージだと、見落とす可能性も0ではない。が、動いているプログラムが使っているテーブルの構造であれば、確実だ。

対象は、schema_versionテーブル。3.xのtable定義(構造)を見てみる。

mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field          | Type          | Null | Key | Default           | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| version_rank   | int(11)       | NO   | MUL | NULL              |       |
| installed_rank | int(11)       | NO   | MUL | NULL              |       |
| version        | varchar(50)   | NO   | PRI | NULL              |       |
| description    | varchar(200)  | NO   |     | NULL              |       |
| type           | varchar(20)   | NO   |     | NULL              |       |
| script         | varchar(1000) | NO   |     | NULL              |       |
| checksum       | int(11)       | YES  |     | NULL              |       |
| installed_by   | varchar(100)  | NO   |     | NULL              |       |
| installed_on   | timestamp     | NO   |     | CURRENT_TIMESTAMP |       |
| execution_time | int(11)       | NO   |     | NULL              |       |
| success        | tinyint(1)    | NO   | MUL | NULL              |       |
+----------------+---------------+------+-----+-------------------+-------+
11 rows in set (0.00 sec)

mysql>

4.2.0以降の定義は、
mysql> desc schema_version;
+----------------+---------------+------+-----+-------------------+-------+
| Field          | Type          | Null | Key | Default           | Extra |
+----------------+---------------+------+-----+-------------------+-------+
| installed_rank | int(11)       | NO   | PRI | NULL              |       |
| version        | varchar(50)   | YES  |     | NULL              |       |
| description    | varchar(200)  | NO   |     | NULL              |       |
| type           | varchar(20)   | NO   |     | NULL              |       |
| script         | varchar(1000) | NO   |     | NULL              |       |
| checksum       | int(11)       | YES  |     | NULL              |       |
| installed_by   | varchar(100)  | NO   |     | NULL              |       |
| installed_on   | timestamp     | NO   |     | CURRENT_TIMESTAMP |       |
| execution_time | int(11)       | NO   |     | NULL              |       |
| success        | tinyint(1)    | NO   | MUL | NULL              |       |
+----------------+---------------+------+-----+-------------------+-------+
10 rows in set (0.00 sec)

mysql>
version_rankというカラムがあるかないかで判断してよさそうだ。

もう1つの注意は4.2.0からのアップグレード方法

migration guideには書いていないのだが、flywayの管理テーブルが変わる。[Spring Boot] Flyway 3系で作ったテーブルを Flyway 5系にアップデートする方法 | DevelopersIO で触れられているのだが、flyway 5.xではdefaultの管理テーブルは変更されていて、なければschema_versionテーブルを使うという動きになっている。

だから気にすることはないといえばないのだが、flyway 6.xでは、この、なければschema_versionテーブルを使うという動きがなくなる。

flyway.table=schema_version
と設定しておくと、管理テーブルとしてschema_versionテーブルを使うようになるので、Spring Boot 2.xにするタイミングで設定しておくのが安全だ。

アップグレードは旬の作業

みんながアップグレードしているときは、話題にもなるし、質問に答えてくれる人も多い。が、いつまでもアップグレードを先送りにしていると、みんな忘れてしまう(あるいは、なかったことにしてしまう)し、アップグレードのためのライブラリーやツールがなくなってしまうこともある。タイミングを逃さずに行わなければならない作業の1つだろう。