Java 用弹簧靴修复飞道
我不太明白在Spring Boot项目中使用Flyway迁移失败时应该怎么做 我只需在我的Java 用弹簧靴修复飞道,java,spring,maven,spring-boot,flyway,Java,Spring,Maven,Spring Boot,Flyway,我不太明白在Spring Boot项目中使用Flyway迁移失败时应该怎么做 我只需在我的pom.xml中添加Flyway依赖项,即可激活Flyway。一切正常。启动Spring Boot应用程序时,我的数据库脚本将被迁移 但我的一个脚本出错,上次迁移失败。现在,当我尝试迁移时,出现了“迁移校验和不匹配”。通常,我会运行mvn flyway:repair,但因为我使用的是Spring Boot,所以我不应该使用flyway Maven插件。那么我应该怎么做呢?有几种方法可以对数据库执行修复。我个
pom.xml
中添加Flyway依赖项,即可激活Flyway。一切正常。启动Spring Boot应用程序时,我的数据库脚本将被迁移
但我的一个脚本出错,上次迁移失败。现在,当我尝试迁移时,出现了“迁移校验和不匹配”。通常,我会运行
mvn flyway:repair
,但因为我使用的是Spring Boot,所以我不应该使用flyway Maven插件。那么我应该怎么做呢?有几种方法可以对数据库执行修复。我个人更喜欢简单的SQL语句
SQL语句:
只需删除迁移失败的行。之后,您可以再次运行迁移
直飞跑道
您可以安装Flyway local并在控制台中运行Flyway repair
使用Flyway Maven插件
将添加到pom并运行mvn flyway:repair
。我不认为这与弹簧靴的概念相矛盾
延长弹簧护套
Spring Boot将调用Flyway.migrate()执行数据库迁移。如果您想要更多的控制,请提供一个实现FlywayMigrationStrategy的@Bean
在FlywayMigrationStrategy
中,您可以从flyway调用迁移或修复方法。有关更多信息,请参阅
我认为应用程序中的FlywayMigrationStrategy
不是修复数据库的正确位置。迁移失败是一个例外,应该在应用程序外部处理。Flyway Maven插件
只需将此信息添加到@Daniel的答案中
一,
。。。
org.flywaydb
当数据库迁移失败时,在模式历史记录表中将迁移标记为失败(即flyway\u schema\u history)
表示可能需要手动清理数据库。但如果数据库支持DDL事务,迁移将自动回滚,模式历史记录表中不会记录任何内容PostgreSQL
,Amazon Redshift
,MS SQL
是少数支持DDL事务的数据库,而Oracle数据库
,MySQL
,MariaDB
,Amazon Aurora
不支持DDL事务
在迁移条目失败的情况下,有几个选项可以修复它(仅适用于不支持DDL事务的数据库),如@daniel-käfer所述。我想添加另一种(可能更简单的方法)来处理失败的迁移
flyway支持几种,其中之一是afterMigrateError
。如果我们在MigrateError.sql之后添加一个名为的sql文件,那么它将在每次失败的迁移运行后执行。因此,我们只需使用sql命令在数据库迁移文件夹(resources/db/migration
)的默认位置上创建一个文件afterMigrateError.sql
,即可从flyway\u schema\u history
表中删除失败的迁移
sql命令afterMigrateError.sql
可以如下所述:
DELETE IGNORE FROM flyway_schema_history WHERE success=0;
此命令查找表flyway\u schema\u history
,如果该表存在,则不会进行任何更改。然后,它只需查找具有success
列和0
项的行(实际上,如果迁移失败,则所有成功的迁移将在success列中具有值1
),然后删除这些项。现在,我们只需更改最新的迁移文件并更正它,然后再次运行。在本地安装flyway,如前所述,将目录更改为安装,然后运行(例如H2):
您可以通过声明下面的bean来通过代码实现
@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
return flyway -> {
flyway.repair();
flyway.migrate();
};
}
我会说手动运行flyway repair
,因为更改以前的sql文件应该是非常特殊的。但是看起来类路径中的sql文件和本地sql文件之间的校验和不匹配…但是,正如我所说的,当使用Spring Boot时,您不需要使用Flyway插件。不,但是使用Flyway,您不需要更改现有的sql文件!特别是如果它们已经在prod db上执行过。每次只应添加带有更改的新SQL文件。我能理解为什么SpringBoot不支持这个:它应该是一个手动操作,当然不应该是默认的。。。(忽略对已经运行的SQL所做的任何更改)好的,但是如何测试SQL脚本呢?手动?或者使用Flyway插件?两者都有。我基本上在我的开发环境中有一个“测试数据库”,我可以随时刷新它:mvn flyway:clean flyway:migrate
。您也可以使用flyway命令行。flyway maven插件可以从我的Spring的Boot application.properties文件中读取数据源属性吗?@IEExcept您想向属性文件中添加什么信息?我已经添加了Spring.datasource.url
,Spring.datasource.username
,spring.datasource.password
。这就是我的应用程序连接到db的方式。我可以为插件重用此属性吗?@IEExcept是的,你可以@我能推荐我正在开发的这个插件吗?包括生成迁移的命令flyway maven插件是否可以从我的Spring的Boot application.properties文件中读取数据源属性?@Daniel Käfer使用FlywayCallback清理schema_版本中的数据如何(即删除失败的迁移)在迁移开始之前?@DharmvirTiwari我认为这不是个好主意。如果第一次失败,第二次也会失败。你必须做一些事情使它工作,你可以手动删除schema_version表中的行。这个方法很棒!比手动输入maven命令方便多了,非常感谢!由于我没有访问数据库本身的权限,所以这项工作非常有效。干杯加上这个。th
./flyway -url=jdbc:h2:/Users/mugo/dev/h2/das-boot -user=sa -password= repair
@Bean
public FlywayMigrationStrategy cleanMigrateStrategy() {
return flyway -> {
flyway.repair();
flyway.migrate();
};
}