web-dev-qa-db-ja.com

Spring Bootによるフライウェイ修理

Spring BootプロジェクトでFlywayを使用して移行が失敗した場合に何をするべきか、私にはよくわかりません。

pom.xmlにFlyway依存関係を追加するだけでFlywayをアクティブにしました。そして、すべてが正常に動作します。 Spring Bootアプリを起動すると、データベーススクリプトが移行されます。

しかし、スクリプトの1つでエラーが発生し、最後の移行が失敗しました。今、移行しようとすると、「移行チェックサムの不一致」があります。通常、mvn flyway:repairを実行しますが、Spring Bootを使用しているため、Flyway Mavenプラグインを使用する必要はありません。だから私は何をすることになっていますか?

データベースの修復を実行する方法はいくつかあります。私は個人的に単純なSQLステートメントを好みます。

SQLステートメント:

移行に失敗した行を削除するだけです。その後、移行を再度実行できます。

フライウェイを直接実行する

Flywayローカルをインストールして、コンソールで_flyway repair_を実行できます

Flyway Mavenプラグインを使用する

Flyway Mavenプラグイン をpomに追加し、_mvn flyway:repair_を実行します。これはSpring Bootのコンセプトと矛盾するとは思わない。

Spring Bootを拡張する

Spring BootはFlyway.migrate()を呼び出してデータベースの移行を実行します。さらに制御したい場合は、FlywayMigrationStrategyを実装する_@Bean_を指定してください。

FlywayMigrationStrategyで、flywayからmigrateまたはrepairメソッドを呼び出すことができます。詳細は Spring Boot Reference Guide で入手できます。

アプリケーションのFlywayMigrationStrategyはデータベースを修復するのに適切な場所ではないと思います。移行の失敗は例外であり、アプリケーションの外部で処理する必要があります。

24
Daniel Käfer

Flyway Mavenプラグイン

この情報を@Danielの回答に追加するだけです

1。

      ...
        <plugin>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-maven-plugin</artifactId>
            <version>4.1.0</version>
            <configuration>
                <url>jdbc:mysql://localhost:3306</url>
                <user>root</user>
                <password>root</password>
                <schemas>
                    <schema>[your_schema]</schema>
                </schemas>
            </configuration>
        </plugin>
      ...

2。

mvn flyway:clean

3。

mvn flyway:repair

PS .:ステップ2と3が機能しない場合、順序を変更します。

Mavenゴールの詳細: https://flywaydb.org/documentation/maven/

4
felipealves.gnu

データベースの移行が失敗すると、スキーマ履歴テーブル(i.e flyway_schema_history)で移行が失敗としてマークされ、データベースの手動クリーンアップが必要になる可能性があることが示されます。ただし、データベースがDDLトランザクションをサポートしている場合、移行は自動的にロールバックされ、スキーマ履歴テーブルには何も記録されません。 PostgreSQLAmazon RedshiftMS SQLはDDLトランザクションをサポートするデータベースの一部ですが、Oracle DatabaseMySQLMariaDBAmazon AuroraはDDLトランザクションをサポートしていません。

移行エントリが失敗した場合、@daniel-käferで説明されているように、それを修復するためのいくつかのオプションがあります(DDLトランザクションをサポートしないデータベースにのみ適用可能)。失敗した移行に対処するために別の(簡単な方法かもしれません)を追加したいと思います。

Flywayでサポートされている コールバック がいくつかあります。afterMigrateErrorはそのうちの1つです。 afterMigrateError.sqlという名前のsqlファイルを追加すると、移行が失敗するたびに実行されます。したがって、データベース移行フォルダーのデフォルトの場所(afterMigrateError.sql)にファイルresources/db/migrationを作成して、sqlコマンドで失敗した移行をflyway_schema_historyテーブルから削除できます。

SqlコマンドafterMigrateError.sqlは次のようになります。

DELETE IGNORE FROM flyway_schema_history WHERE success=0;

このコマンドは、テーブルが存在する場合flyway_schema_historyを検索します。存在しない場合は、変更を行いません。次に、0エントリを持つsuccess列を持つ行を検索します(実際に移行が失敗した場合に発生し、成功したすべての移行の値は成功列に1になります)。エントリ。これで、最新の移行ファイルを変更して修正し、再度実行することができます。

0
BishalG

上記 のようにフライウェイをローカルにインストールし、ディレクトリをインストールに変更してから実行します(H2の例):

./flyway -url=jdbc:h2:/Users/mugo/dev/h2/das-boot -user=sa -password= repair
0
xilef