Flyway Validate failed:migration checksum mismatch for migration 1.0.0003

本文介绍了使用Flyway进行数据库迁移时遇到ChecksumMismatch错误的原因及两种解决方案:使用FlywayRepair命令修复元数据表,或手动删除错误记录后重新执行脚本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在server端跑flyway的时候遇到这个问题,简单的总结一下:

首先看一下Flyway的官网介绍https://flywaydb.org/getstarted/how


在使用flyway的时候,简单的流程: 

新建一个数据库



当配置好flyway的基本信息后,运行flyway,会在数据库表中默认新建一个数据表,用于存储flyway的运行信息,默认的数据库名:SCHEMA_VERSION


此表将用于跟踪数据库的状态。


紧接着Flyway将开始扫描文件系统或应用程序的类路径进行迁移。 它们可以用Sql或Java编写。

然后,Flyway的数据迁移将基于对用sql脚本的版本号进行排序,并按顺序应用:


当每个数据表执行之后,其对应的执行信息也会在SCHEMA_VERSION中进行更新


可以看到执行数据库表后在checksum中储存一个数值,用于在之后运行过程中对比sql文件执行是否有变化。


当再次执行Flyway的时候,Flyway将再次扫描文件系统或应用程序的类路径以进行迁移。 将根据元数据表检查迁移。 如果其版本号低于或等于标记为当前版本的版本号,则会被忽略。


其他的的迁移是待处理的迁移:可以使用,单数不会再数据库中执行脚本。

之后脚本重新按照版本号进行排序,并按照顺序执行脚本文件

这时候SCHEMA_VERSION中的记录也会被更新


现在回到遇到的问题

Flyway   Validate failed:migration checksum mismatch for migration 1.0.0003

->Applied to database:37561532->Resolved locally : -351684334


在执行第三个脚本文件的时候遇到问题,原有的checksum值和本次执行的checksum值对应不上

说明在这次运行的脚本中对版本号为1.0.0003的脚本文件有了修改,与原来执行的chencksum对应不上,此时Flyway会报错,

停止执行后续的脚本。


具体的解决方案:

方案一:

查看官网提供的命令:Flyway Repair命令

用于修复元数据表SCHEMA_VERSION


Repair是修复元数据表问题的工具。 它有两个主要用途:

删除失败的迁移条目(仅适用于不支持DDL事务的数据库)
将应用的迁移的校验和重新对齐到可用迁移的校验和


所以在执行flyway migrate之前,先执行 flyway repair,之后执行新的flyway脚本,会忽略原有的checksum值



方案二:

手动进入数据库,把出错的那行包括改行之后的所有数据删除,在执行flyway脚本的时候,他会发现在元数据表中没有执行过之前脚本的记录,所以会从该脚本开始运行,运行时也是按照版本号。但是不要再运行环境中使用这种方案,操作的时候也要注意相关数据的备份




注意:

flyway在执行脚本时,会在源数据表中检查checksum值,并确定上次运行运行到哪一个脚本文件,本次执行时从下一条脚本文件开始执行。

所以需要注意下:

编写脚本的时候不要去修改原有的脚本内容

新的脚本版本号要连续

注意如果在server上执行flyway,确保本地的脚本代码运行成功,之后再通过版本管理工具传递到server上









<think>我们已知错误是Flyway校验和不匹配,具体发生在版本20250823.2的迁移脚本上。 根据提供的配置,我们注意到Flyway的迁移脚本位置在`classpath:db/migration`,并且使用了指定的数据源配置。 错误原因:迁移脚本`V20250823.2__*.sql`的内容在应用后被修改,导致Flyway计算出的校验和与数据库`flyway_schema_history`表中记录的校验和不一致。 解决方案: 1. 修复校验和(推荐):使用Flyway的repair命令。 2. 恢复迁移文件:如果修改是意外的,从版本控制中恢复该文件。 3. 创建新迁移:如果修改是必要的,创建新的迁移文件并应用。 4. 临时禁用验证(仅开发):设置`spring.flyway.validate-on-migrate=false`。 由于配置中使用了Spring Boot的Flyway自动配置,我们可以通过以下步骤操作: 步骤1:尝试使用Flyway的repair命令 在Spring Boot项目中,可以通过Maven或Gradle插件执行repair。 如果使用Maven,在pom.xml中配置Flyway插件: ```xml <build> <plugins> <plugin> <groupId>org.flywaydb</groupId> <artifactId>flyway-maven-plugin</artifactId> <version>7.15.0</version> <!-- 使用与Spring Boot兼容的版本 --> <configuration> <url>${datasource.url.1}</url> <user>${datasource.user.1}</user> <password>${datasource.password.1}</password> <locations>classpath:db/migration</locations> </configuration> </plugin> </plugins> </build> ``` 然后运行命令:`mvn flyway:repair` 如果使用Gradle,在build.gradle中配置: ```groovy plugins { id "org.flywaydb.flyway" version "7.15.0" } flyway { url = project.properties['datasource.url.1'] user = project.properties['datasource.user.1'] password = project.properties['datasource.password.1'] locations = ['classpath:db/migration'] } ``` 然后运行:`gradle flywayRepair` 步骤2:如果修复命令执行成功,重新启动应用。 步骤3:如果不想使用repair,或者repair无法解决问题,可以考虑手动处理: - 检查迁移文件`V20250823.2__*.sql`的内容,确认是否被修改。如果是,恢复它(从版本控制中检出)或者创建一个新的迁移文件(如果修改是必要的)。 - 如果修改是必要的,那么应该创建新的迁移文件(例如`V20250823.3__fix_issue.sql`),然后删除或忽略旧文件(但注意:旧文件已经被应用,所以不能删除,只能通过repair修复校验和,或者通过新迁移来修正)。 步骤4:如果问题在开发环境中,并且希望快速启动,可以临时禁用验证(不推荐长期使用): 在application.properties中添加: ```properties spring.flyway.validate-on-migrate=false ``` 注意:禁用验证后,应用可以启动,但下次启动前应解决校验和问题,否则生产环境可能出错。 预防措施:在团队协作中,一旦迁移脚本被应用,就不要再修改它。任何后续修改都应通过新的迁移脚本完成。 根据上述分析,给出具体解决方案。</think>### Flyway校验和错误解决方案(基于您的配置) 根据您提供的Flyway配置和错误信息,以下是针对性的解决方案: ```properties # 您的Flyway配置 spring.flyway.locations=classpath:db/migration spring.flyway.url=${datasource.url.1} spring.flyway.user=${datasource.user.1} spring.flyway.password=${datasource.password.1} ``` #### 问题原因: 版本为`20250823.2`的迁移文件(位于`src/main/resources/db/migration/V20250823.2__*.sql`)内容被修改,导致Flyway计算的校验和与数据库`flyway_schema_history`表中存储的校验和不匹配。 #### 推荐解决方案: 1. **使用Flyway Repair修复校验和**(推荐): ```bash # Maven项目 mvn flyway:repair -Dflyway.url=jdbc:your_db_url -Dflyway.user=your_user -Dflyway.password=your_pwd # Gradle项目 gradle flywayRepair -Dflyway.url=jdbc:your_db_url -Dflyway.user=your_user -Dflyway.password=your_pwd ``` 修复后Flyway会更新`flyway_schema_history`表的校验和值 2. **恢复原始迁移文件**: - 从版本控制(Git)恢复`V20250823.2__*.sql`文件的原始版本 - 或手动核对文件内容与数据库当前状态是否一致 3. **创建修正迁移**(当修改必需时): ```sql -- 新建文件:src/main/resources/db/migration/V20250823_2_1__fix_checksum.sql -- 包含必要的修正SQL ``` 4. **临时解决方案(仅限开发)**: 在`application.properties`中添加: ```properties spring.flyway.validate-on-migrate=false spring.flyway.clean-on-validation-error=true ``` #### 配置注意事项: 1. 确保`${datasource.url.1}`等占位符在运行时能正确解析 2. 检查迁移文件命名规范:`V20250823.2__Description.sql`(双下划线) 3. 验证数据库用户是否有`flyway_schema_history`表的读写权限 > **生产环境警告**:不要使用`clean-on-validation-error`选项,可能导致数据丢失!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值