Q.migrate_db コマンドを実行してもDBにテーブルが作成されない場合はどうしたらよいでしょうか?
A.migrate_db コマンドを実行してもDBにテーブルが作成されない場合、migate_db.bat/migrate_db.sh を実行した際に表示されるログをご確認ください。
その際、下記のようなメッセージが表示されている場合、migrate_db.bat が多重実行されてしまっている、もしくは同ファイル実行中に、別アカウントが PostgreSQL を操作している可能性があります。
2020-10-10 00:10:20 [WARN org.flywaydb.core.internal.sqlscript.DefaultSqlScriptExecutor warn] DB: すでにトランザクションが実行中です (SQL State: 25001 - Error Code: 0) 2020-10-10 00:10:30 [ERROR org.flywaydb.core.internal.command.DbMigrate error] Migration of schema "public" to version 20220714.1524 failed! Changes successfully rolled back. |
対応として、一旦DBを停止 → 再起動し、アプリケーション も停止して、誰もDBにログオンしていない状態としてください。
その状態から、migrate_db だけを実行してください。
上記の対応を実施しても解消しない場合、DB の差分管理をしているflyway用の管理テーブル「flyway_schema_history」のステータスが実行中のまま固まってしまった、差分管理できない状態になってしまっています。
この状態ではコマンドからの操作ができなくなってしまったため、復旧作業を実施してください。
復旧作業は以下の手順で実施します。
- DBのflyway_schema_history というテーブルを直接確認します。
- success列の値を確認し、手動でテーブルを修正したあと、この値を 1 に書き換える必要があります。
例えば次のような sql になります。
update flyway_schema_history set success=1 where installed_rank=6; ※where句は環境に対して適当に合わせてください。 |
手動でのテーブルを修正は、ddl_hist フォルダに sqlが用意されておりますので、これを日付の若い順から目視チェックし、最新のテーブル定義と差異があるものについて、この sqlを使って修正をかけていきます。
※「正」となるテーブル定義自体は Wagby が生成した wagbyapp/webapps/wagby/WEB-INF/export/conf/createddl にあるものを利用してください。
すべて対応後、migratedb/diff にある sql は削除することを推奨いたしますが、念のためバックアップを取得してから削除してください。
復旧作業は、テーブル定義の変更となるため、作業前にはフルバックアップを行い、何か問題があれば戻せるようにしてから作業を開始してください。