flywayとは?
DBのスキーマ変更をバージョン管理するツール。
DDLとDML呼ばれるSQLファイルを作成し、コマンドラインでMigrationすることでDBを変更する。
DDL
Data Definition Language。スキーマの定義や変更(CREATE、ALTER、DROP、TRUNCATE)を管理する。バージョンをインクリメントして整合性を保つ。
DML
Data Manipulation Language。マスタデータを更新(INSERT、UPDATE、DELETE、SELECT)する。バージョン管理はしない。
インシデント
Detected resolved migration not applied to database: XXX
flywayMigrate実行時エラー
> Task : flywayMigrate
Caching disabled for task ':flywayMigrate' because;
Build cache is disabled
Task flywayMigrate' is not up-to-date because:
Task has not declared any outputs despite executing actions.
* What went wrong:
Execution failed for task ': flywayMigrate'.
> Error occurred while executing flywayMigrate
Validate failed:
Detected resolved migration not applied to database: 00.000.563
Detected resolved migration not applied to database: 00.000.564
Detected resolved migration not applied to database: 00.000.565
Detected resolved migration not applied to database: 00.000.566
Detected resolved migration not applied to database: 00.000.567
以下のコマンドを実行して、定義ファイルをチェックする
gradlew flywayValidate
以下の条件でFAILEDとなる。
- 『flyway_schema_history』と『定義ファイル』のtypeとchecksumが不一致
- 『build.gradle の target』と『Schema version』が不一致
>FAILEしたので定義ファイルがおかしい
flywayMigrate実行ログを見てみると、以下のエラー。
Detected resolved migration not applied to database: 00.000.XXX // データベースに適用されていない解決済みの移行が検出されました
flyway Infoで見たところ、実行履歴の一部がIgnoreとなっており、これらが無視されているため順序がおかしいとのエラーが出ているよう。
scheme_historyを修正する_方法1
手順は複雑だが、何が起きているかわかりやすいのでまずはこちらで解説する。
とにかく簡単に解消だけしたい場合は方法2を参照。
flywayのバージョンはscheme_historyというテーブルで管理されているので、このテーブルを修正する。
例えば、バージョン100と200でMigrate済みのスキーマに、バージョン150のDDLを追加してMigrateしようとすると、150がIgnoreとなる。 以下の手順で解消する。
scheme_historyに接続し、バージョン200のレコードを削除する。
flywayMigrate実行すると、バージョン150は通るが、以下のエラーとなる。
ORA-00955: name is already used by an existing object // ORA-00955: すでに使用されているオブジェクト名です
バージョン200はすでに実行済みのため、同じテーブルを作ろうとしてエラーとなっている。
scheme_historyのバージョン200のレコードを見ると、success カラムが0となっているので、これを1に変えてあげる。
scheme_historyを修正する_方法2
flywayInfoで、Ignoreとなっているhistoryレコードを削除(バックアップはしておく)し、flywayMigrateを再実行する。
Migration checksum mismatch for migration version 00.000.XXX
flywayMigrate実行時エラー。
flywayRepairで修復可能。
Found non-empty schema(s)
flyway実行前にテーブルにデータ移行したため、 空でないスキーマにflywayは実行でき
ないと怒られている。
すべてのテーブルをDROPして再実行し解消。
コメント