Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用弹簧靴修复飞道_Java_Spring_Maven_Spring Boot_Flyway - Fatal编程技术网

Java 用弹簧靴修复飞道

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插件。那么我应该怎么做呢?有几种方法可以对数据库执行修复。我个

我不太明白在Spring Boot项目中使用Flyway迁移失败时应该怎么做

我只需在我的
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();
    };
}