Spring BootプロジェクトでFlywayを使用して移行が失敗した場合に何をするべきか、私にはよくわかりません。
pom.xml
にFlyway依存関係を追加するだけでFlywayをアクティブにしました。そして、すべてが正常に動作します。 Spring Bootアプリを起動すると、データベーススクリプトが移行されます。
しかし、スクリプトの1つでエラーが発生し、最後の移行が失敗しました。今、移行しようとすると、「移行チェックサムの不一致」があります。通常、mvn flyway:repair
を実行しますが、Spring Bootを使用しているため、Flyway Mavenプラグインを使用する必要はありません。だから私は何をすることになっていますか?
データベースの修復を実行する方法はいくつかあります。私は個人的に単純なSQLステートメントを好みます。
移行に失敗した行を削除するだけです。その後、移行を再度実行できます。
Flywayローカルをインストールして、コンソールで_flyway repair
_を実行できます
Flyway Mavenプラグイン をpomに追加し、_mvn flyway:repair
_を実行します。これはSpring Bootのコンセプトと矛盾するとは思わない。
Spring Bootは
Flyway.migrate()
を呼び出してデータベースの移行を実行します。さらに制御したい場合は、FlywayMigrationStrategy
を実装する_@Bean
_を指定してください。
FlywayMigrationStrategy
で、flywayからmigrateまたはrepairメソッドを呼び出すことができます。詳細は Spring Boot Reference Guide で入手できます。
アプリケーションのFlywayMigrationStrategy
はデータベースを修復するのに適切な場所ではないと思います。移行の失敗は例外であり、アプリケーションの外部で処理する必要があります。
この情報を@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/
データベースの移行が失敗すると、スキーマ履歴テーブル(i.e flyway_schema_history)
で移行が失敗としてマークされ、データベースの手動クリーンアップが必要になる可能性があることが示されます。ただし、データベースがDDLトランザクションをサポートしている場合、移行は自動的にロールバックされ、スキーマ履歴テーブルには何も記録されません。 PostgreSQL
、Amazon Redshift
、MS SQL
はDDLトランザクションをサポートするデータベースの一部ですが、Oracle Database
、MySQL
、MariaDB
、Amazon 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
になります)。エントリ。これで、最新の移行ファイルを変更して修正し、再度実行することができます。
上記 のようにフライウェイをローカルにインストールし、ディレクトリをインストールに変更してから実行します(H2の例):
./flyway -url=jdbc:h2:/Users/mugo/dev/h2/das-boot -user=sa -password= repair