web-dev-qa-db-ja.com

フライウェイが失敗した移行を再試行する

私はフライウェイを構成して完全に理解している最中で、次のような状況に陥りました。

  • Flywayで動作するように新しいプロジェクトを正常に構成しました。
  • テストデータベースをバージョン0から1.0.3に正常に移行しました。
  • バージョン1.0.4への移行の実行に失敗しました。 (私はすでにそこにあった列を追加しようとしていました、今のところ問題はありません、私の悪いです。)

ただし、対応するスクリプトに必要な変更を加えて機能させると、flywayは次のメッセージを表示し続けました。

 Current schema version: 1.0.4
 com.googlecode.flyway.core.migration.MigrationException: Migration to version 1.0.4 failed! Please restore backups and roll back database and code!

完全なダンプを復元してすべての移行を再度適用するのではなく、alter tableスクリプトを機能させるために、「schema_version」テーブルにいくつかの変更を加えました。

  • 最初にバージョン1.0.4のエントリを削除しました
  • 2番目に、バージョン1.0.3の 'current_version'フィールドを1に設定しました
  • そしてflyway:migrateコマンドを再度実行しました

その後、最終的に移行が適用され、成功メッセージが表示されましたが、これがこのような状況に対処するための適切なアプローチであるかどうかはよくわかりません。 'schema_version'テーブルを自分で変更する権利があるかどうかはわかりません。フライウェイ自体によってのみ変更する必要があるからです。

だから、私に何が起こったのかを説明した後、私の質問は:

「schema_version」テーブルを自分で変更せずに、フライウェイで失敗した移行を適用する「再試行」する方法はありますか?

このタスクを実行するために知らないコマンドはありますか?

18
pablocmg

これはFAQで回答されています: http://flywaydb.org/documentation/faq.html#repair

今後のFlyway 2.0には、repairコマンドが含まれます。このコードはすでにSCMにチェックインされています。

注:これはFlywayのメタデータテーブルのみを扱います。移行の失敗によるその他の影響をクリーンアップするのは、引き続き責任があります。

更新:Flyway 2.0がリリースされました。 http://flywaydb.org で入手できます。

8
Axel Fontaine

これが良いアイデアかどうかはわかりませんが、migrate()が失敗した場合はrepair()を試すことができます。

final Flyway flyway = new Flyway();
flyway.setBaselineOnMigrate(true);
flyway.setValidateOnMigrate(false);
flyway.setDataSource(dataSource());
try {
    flyway.migrate();
} catch (final Exception e) {
    logger.error("Flyway migration failed, doing a repair and retrying ...");
    flyway.repair();
    flyway.migrate();
}
4
yglodt

完全な例では、これは常に移行を実行する前に修復を試み、残りの設定は設定ファイルにあります。

@Configuration
public class PersistanceConfiguration {
    protected final Logger log = LoggerFactory.getLogger(this.getClass());

    @Bean
    public FlywayMigrationStrategy cleanMigrateStrategy() {
        FlywayMigrationStrategy strategy = new FlywayMigrationStrategy() {
            @Override
            public void migrate(Flyway flyway) {
                flyway.repair();
                flyway.migrate();
            }
        };
        return strategy;
    }

}
0
Orhan