使用 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。 PostgreSQL
、Amazon Redshift
、MS SQL
是支持 DDL 事务的少数数据库,而 Oracle Database
、MySQL
、MariaDB
、Amazon 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();
};
}
我不太明白在 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 implementsFlywayMigrationStrategy
.
在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。 PostgreSQL
、Amazon Redshift
、MS SQL
是支持 DDL 事务的少数数据库,而 Oracle Database
、MySQL
、MariaDB
、Amazon 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 -url=jdbc:h2:/Users/mugo/dev/h2/das-boot -user=sa -password= repair
您可以通过代码声明以下 bean 来实现。
@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
return flyway -> {
flyway.repair();
flyway.migrate();
};
}