You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

仅在H2文件模式下出现Flyway迁移验证失败问题求助

问题:Spring Boot + Flyway + 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.

相同的迁移脚本在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:\myApi\api\src\integrationTest\resources\db.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:\myApi\api\src\integrationTest\resources\db.h2.migration

版本信息

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

可能的原因分析

  • 残留的文件数据库状态:H2文件模式会持久化数据到本地文件,之前启动失败时可能已在flyway_schema_history表中标记版本22.3.0.0为失败状态,同时脚本的部分变更已写入数据库。内存模式每次启动都是全新环境,无遗留状态。
  • 文件数据库权限问题:本地./data/myDB目录或文件缺少读写权限,导致迁移脚本执行到一半无法写入,触发失败。内存模式不存在文件权限限制。
  • Flyway与数据源的URL参数不一致:文件模式下数据源URL带有;DB_CLOSE_ON_EXIT=FALSE参数,但Flyway的URL未包含该参数,可能导致连接行为不一致,比如连接关闭时机不同,引发迁移异常。
  • H2模式特性差异:H2文件模式和内存模式在事务持久化、锁机制等方面存在差异,脚本在内存模式下正常,但文件模式可能因磁盘存储特性触发隐藏问题,比如长事务未提交或锁冲突。
  • 本地文件损坏:./data/myDB相关数据库文件损坏,导致H2无法正常读写,迁移过程出错。
  • 版本兼容性问题:Flyway 7.2.1与H2 2.1.214可能存在兼容性问题,内存模式未暴露,但文件模式下触发了该问题。

内容的提问来源于stack exchange,提问作者Shabar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 02:37:38