株式会社セキュアイノベーション
Menu

セキュリティコラム

  • ネットワーク

公開:2023.01.30 10:00 | 更新: 2023.01.30 12:21

DBスキーマ管理ツール(Flyway)でERROR: Validate failed: Migrations have failed validationが出たら

DBスキーマ管理ツール(Flyway)でERROR: Validate failed: Migrations have failed validationが出たらDBスキーマ管理ツール(Flyway)でERROR: Validate failed: Migrations have failed validationが出たら

Flywayについて

概要

データベースのバージョンを管理してくれるツールです。
対応しているデータベースは幅広く、ファイル名がFlywayのお約束に従っていればDDLやDMLでのマイグレーション(DBスキーマのバージョンアップ)を行ってくれます。
既存DBへの導入方法と基本のマイグレーションについては過去記事「既存DBにスキーマ管理ツール(Flyway)を導入する 」を参照ください。

公式サイト https://flywaydb.org/

ERROR: Validate failed: Migrations have failed validationが出たら

結論

下記のようにrepairコマンドを実行します。

./flyway repair

詳細

管理テーブル

flywayはスキーマ管理用にflyway_schema_historyというテーブルを保持しています。

test_db=# \dt
List of relations
Schema | Name | Type | Owner
--------+-----------------------+-------+----------
public | flyway_schema_history | table | postgres
(1 row)


test_db=# select * from flyway_schema_history;
installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success
----------------+----------------+------------------------+----------+---------------------------------------------+----------+--------------+----------------------------+----------------+---------
1 | 2.0.0 | baseline_migration | BASELINE | baseline_migration | | postgres | 2023-01-23 16:52:49.694519 | 0 | t
2 | 2.0.0.20230123 | Seconde test migration | SQL | V2.0.0.20230123__Seconde_test_migration.sql | 0 | postgres | 2023-01-23 16:54:27.402267 | 10 | t
(2 rows)

チェックサム

flywayはマイグレーションしたsqlファイルのチェックサムを保持しています。

例えば、一度マイグレーションしたsqlファイルが何らかの都合で書き換えます。
(私の所属するチームではコードレビューを行っていますので、レビューのフィードバック対応を行うタイミングなどで発生します。)

書き換えてマイグレーションを実行すると、flywayがチェックサムを確認し一致しないと「ERROR: Validate failed: Migrations have failed validation」と怒られます。

# ./flyway migrate
Flyway Community Edition 9.12.0 by Redgate
See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#9.12.0

Database: jdbc:postgresql://localhost:5432/test_db (PostgreSQL 12.13)
ERROR: Validate failed: Migrations have failed validation
Migration checksum mismatch for migration version 2.0.0.20230123
-> Applied to database : 0
-> Resolved locally : 1531363961
Either revert the changes to the migration, or run repair to update the schema history.
Need more flexibility with validation rules? Learn more: https://rd.gt/3AbJUZE

repair

repairを実行すると下記のようにflyway_schema_historyのレコードが書き換えられます。

test_db=# select * from flyway_schema_history;
installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success
----------------+----------------+------------------------+----------+---------------------------------------------+------------+--------------+----------------------------+----------------+---------
1 | 2.0.0 | baseline_migration | BASELINE | baseline_migration | | postgres | 2023-01-23 16:52:49.694519 | 0 | t
2 | 2.0.0.20230123 | Seconde test migration | SQL | V2.0.0.20230123__Seconde_test_migration.sql | 1531363961 | postgres | 2023-01-23 16:54:27.402267 | 10 | t
(2 rows)

checksum列がmigrate時に怒られた「0」から「1531363961」になっているのが確認できます。

下記はrepair実行時のログです。該当のsqlファイルのチェックサムについて修正されているのがわかります。

# ./flyway repair
Flyway Community Edition 9.12.0 by Redgate
See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#9.12.0

Database: jdbc:postgresql://localhost:5432/test_db (PostgreSQL 12.13)
Repair of failed migration in Schema History table "public"."flyway_schema_history" not necessary. No failed migration detected.
Repairing Schema History table for version 2.0.0.20230123 (Description: Seconde test migration, Type: SQL, Checksum: 1531363961) ...
Successfully repaired schema history table "public"."flyway_schema_history" (execution time 00:00.069s).

もう一度migrate

repair後、再度migrateすると上手くいきます。

# ./flyway migrate
Flyway Community Edition 9.12.0 by Redgate
See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#9.12.0

Database: jdbc:postgresql://localhost:5432/test_db (PostgreSQL 12.13)
Successfully validated 2 migrations (execution time 00:00.051s)
Current version of schema "public": 2.0.0.20230123
Schema "public" is up to date. No migration necessary.

シリーズ
 既存DBにスキーマ管理ツール(Flyway)を導入する

参考サイト
 flyway
 flyway Documentation (Existing Database Setup)

最新のコラム記事

LOADING...

セキュアイノベーション サービス一覧

ネットワーク・サーバー

Webサイトを守る