flyway備忘録

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して再実行し解消。

コメント

タイトルとURLをコピーしました