使用 Spring 引导修复飞路

Flyway repair with Spring Boot

我不太明白在 Spring 引导项目中使用 Flyway 迁移失败时我应该做什么。

我通过简单地在 pom.xml 中添加 Flyway 依赖项来激活 Flyway。一切正常。当我启动 Spring 引导应用程序时,我的数据库脚本被迁移。

但是我的一个脚本出错了,最后一次迁移失败了。现在,当我尝试迁移时,出现 "Migration checksum mismatch"。通常,我会 运行 mvn flyway:repair,但由于我使用的是 Spring Boot,因此我不应该使用 Flyway Maven 插件。那我该怎么办?

有多种方法可以对数据库进行修复。我个人更喜欢简单的 SQL 语句。

SQL声明:

只需删除迁移失败的行即可。之后您可以 运行 再次迁移。

运行飞路直接

你可以在本地安装Flyway,在控制台运行 flyway repair

使用 Flyway Maven 插件

Flyway Maven Plugin 添加到您的 pom 和 运行 mvn flyway:repair。我不认为这与 Spring 启动概念相矛盾。

扩展Spring引导

Spring Boot will call Flyway.migrate() to perform the database migration. If you would like more control, provide a @Bean that implements FlywayMigrationStrategy.

FlywayMigrationStrategy中,您可以从 flyway 调用迁移或修复方法。 Spring Boot Reference Guide.

中提供了更多信息

我认为应用程序中的 FlywayMigrationStrategy 不是修复数据库的正确位置。失败的迁移是一个例外,应该在应用程序外部处理。

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/

当数据库迁移失败时,迁移在架构历史记录中被标记为失败 table (i.e flyway_schema_history) 表明可能需要手动清理数据库。但是如果数据库支持 DDL 事务,迁移会自动回滚,模式历史记录中不会记录任何内容 table。 PostgreSQLAmazon RedshiftMS SQL 是支持 DDL 事务的少数数据库,而 Oracle DatabaseMySQLMariaDBAmazon Aurora不支持 DDL 事务。

如果迁移条目失败,有几个选项可以修复它(仅适用于不支持 DDL 事务的数据库),如@daniel-käfer 所述。我想添加另一个(可能更简单的方法)来处理失败的迁移。

flyway支持的callbacks有几种,afterMigrateError就是其中之一。如果我们添加一个名为 afterMigrateError.sql 的 sql 文件,它将在每次迁移失败 运行 后执行。因此,我们可以简单地使用 sql 命令在数据库迁移文件夹 (resources/db/migration) 的默认位置创建一个文件 afterMigrateError.sql,以从 flyway_schema_history table 中删除失败的迁移。

sql命令afterMigrateError.sql可以如下所述:

DELETE IGNORE FROM flyway_schema_history WHERE success=0;

此命令查找 table flyway_schema_history(如果存在),否则它将不做任何更改。然后它只是查找具有 success 列和 0 条目的行(实际上如果迁移失败就会发生这种情况,所有成功的迁移将在成功列中具有值 1),然后删除这些条目.现在,我们可以简单地更改我们最新的迁移文件并更正它并再次运行。

按照 在本地安装 flyway,然后将目录更改为安装 运行(H2 的示例):

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

您可以通过代码声明以下 bean 来实现。

@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
    return flyway -> {
        flyway.repair();
        flyway.migrate();
    };
}