Flyway Migrations仅在H2文件模式下验证错误失败



我试图在Spring-boot中运行H2文件模式与Flyway

我可以看到下面的错误在应用程序启动。

Caused by: org.flywaydb.core.api.exception.FlywayValidateException: Validate failed: Migrations have failed validation
Detected failed migration to version 22.3.0.0 (create initial tables).
Please remove any half-completed changes then run repair to fix the schema history.
Need more flexibility with validation rules? Learn more: https://rd.gt/3AbJUZE

据我所知,这可能是由于迁移脚本错误造成的。然而,相同的迁移脚本工作时,我使用H2内存模式。因此,这证明了迁移脚本没有任何问题。

H2文件基属性

spring:
cache:
enabled: false
datasource:
url: jdbc:h2:./data/myDB;DB_CLOSE_ON_EXIT=FALSE  
username: sa
password: sa
driverClassName: org.h2.Driver
baseline-on-migrate: true
jpa:
defer-datasource-initialization: false
show-sql: true
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.OracleDialect
flyway:
enabled: true
username: sa
password: sa  
url: jdbc:h2:./data/myDB 
baseline-on-migrate: true
locations: filesystem:C:myApiapisrcintegrationTestresourcesdb.h2.migration

H2内存属性

spring:
cache:
enabled: false
datasource:
url: jdbc:h2:mem:myDB;DB_CLOSE_DELAY=-1  
username: sa
password: sa
driverClassName: org.h2.Driver
baseline-on-migrate: true
jpa:
defer-datasource-initialization: false
show-sql: true
hibernate:
ddl-auto: none
database-platform: org.hibernate.dialect.OracleDialect
flyway:
enabled: true
username: sa
password: sa  
url: jdbc:h2:mem:myDB 
baseline-on-migrate: true
locations: filesystem:C:myApiapisrcintegrationTestresourcesdb.h2.migration

这里还会发生什么?

版本:

Spring Boot v2.7.8, Spring v5.3.25
"flyway", "7.2.1"
"h2", "2.1.214"

使用内存数据库时,Flyway从一个空数据库开始。所有的脚本运行没有错误。

另一方面,在文件版本中已经有了更改的历史记录。Flyway有自己的表来维护以前迁移的状态。显然其中一个没有成功,在表格上标记为完成了一半。它的版本是22.3.0.0

解决方案1

初始化数据库为空。从头开始重新运行Flyway迁移。

解决方案2

在数据库中手动更改迁移失败的状态。从这个开始重新运行Flyway。

编辑:从你的评论我可以看到,错误仍然发生,即使数据库是空的。这意味着您的设置对于该场景是错误的。在应用程序中。请更改以下属性:

删除这个属性:

spring.datasource.baseline-on-migrate
spring.jpa.defer-datasource-initialization
spring.flyway.url
spring.flyway.username
spring.flyway.password
spring.flyway.baseline-on-migrate

设置:

spring.jpa.generate-ddl=false

上述设置的原因是Flyway应该使用与Spring相同的数据源,而不是尝试创建不同的数据源。它还应该避免从实体创建表。

不要使用数据。SQL将测试数据插入数据库。它不能与Flyway迁移混合。而是移动你的数据。sql脚本迁移到具有迁移功能的目录,并将其重命名为以V_23_0_xxx开头。这样,它将在最后一次迁移(V_22_3_xxx

)之后执行。我希望它有帮助。否则,请在应用程序启动期间共享完整的日志。不只是几行。

最新更新