Flyway Validate failed:migration checksum mismatch for migration 2.2

系统里面使用了Flyway,一个数据库版本管理工具。

有一个sql文件版本号2.2,第一次自动执行成功了


后面发现2.2里面sql有问题,修改sql内容后,再次启动,报错类似如下 

Flyway   Validate failed:migration checksum mismatch for migration 2.2

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

原来的checksum和现在文件的checksum不相同

解决方式:

直接修改flyway_schema_history表中的checksum值,再次执行,正常


<think>我们正在讨论的是如何在Solon框架中集成Flyway进行数据库迁移。根据之前的引用内容,用户可能遇到了Flyway的校验和错误(Migration checksum mismatch)的问题,并且希望了解如何在Solon中正确使用Flyway。 步骤: 1. 添加Flyway依赖 2. 配置Flyway(数据源、迁移脚本位置等) 3. 执行迁移(通常在应用启动时) 4. 处理常见问题(如校验和错误) 注意:Solon是一个轻量级Java开发框架,因此我们可以使用Flyway的Java API或者通过Solon的插件机制来集成。 根据引用[^1][^2][^3][^4],我们知道Flyway在校验和错误时通常是因为已经执行过的迁移脚本被修改,导致Flyway检测到脚本的checksum与元数据表中记录的不一致。解决方式有两种: a. 修复元数据表中的checksum(通过flyway:repair命令或手动更新) b. 重新创建数据库(开发环境) c. 使用-outOfOrder参数(但需谨慎) 但是,我们的重点是如何在Solon中集成Flyway。 下面将详细介绍集成步骤:</think>### Solon 框架中集成 Flyway 实现数据库迁移 #### 一、核心步骤 1. **添加依赖** 在 `pom.xml` 中添加 Flyway 和 Solon JDBC 依赖: ```xml <dependency> <groupId>org.flywaydb</groupId> <artifactId>flyway-core</artifactId> <version>9.22.0</version> </dependency> <dependency> <groupId>org.noear</groupId> <artifactId>solon-jdbc</artifactId> </dependency> ``` 2. **配置数据源** 在 `app.yml` 中配置数据库连接: ```yaml jdbc: default: url: jdbc:mysql://localhost:3306/db_demo username: root password: 123456 driverClassName: com.mysql.cj.jdbc.Driver ``` 3. **创建迁移脚本** 在 `resources/db/migration` 目录下创建 SQL 脚本(命名规则:`V{版本}__{描述}.sql`): ```sql -- V1.0__create_user_table.sql CREATE TABLE user ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL ); ``` 4. **初始化 Flyway** 在 Solon 启动类中集成 Flyway: ```java @Configuration public class App { public static void main(String[] args) { Solon.start(App.class, args, app -> { // 获取数据源 DataSource dataSource = app.cfg().getBean(DataSource.class); // 配置 Flyway Flyway flyway = Flyway.configure() .dataSource(dataSource) .locations("db/migration") .load(); // 执行迁移 flyway.migrate(); }); } } ``` #### 二、常见问题解决 1. **校验和错误(Checksum Mismatch)** 当已执行的 SQL 脚本被修改时,Flyway 会报错: `Validate failed: Migration checksum mismatch for migration version` **解决方案**: - **修复元数据**(开发环境): ```java flyway.repair(); // 重置元数据校验和 ``` - **手动更新**(生产环境): ```sql UPDATE flyway_schema_history SET checksum = -1934991199 -- 新校验和(通过flyway.info()获取) WHERE version = '1.0'; ``` 2. **乱序执行迁移** 允许非连续版本迁移(慎用于生产环境): ```java Flyway.configure() .outOfOrder(true) // 启用乱序执行 .load() .migrate(); ``` #### 三、最佳实践 1. **版本管理** - 使用语义化版本:`V1.0.1__add_email_column.sql` - 禁止修改已部署的脚本(需新增版本修复) 2. **多环境配置** 在 `app.yml` 中区分环境: ```yaml # 开发环境 jdbc.default.url: "jdbc:h2:mem:test" # 生产环境(通过 -Dprofile=prod 激活) jdbc.prod: url: "jdbc:mysql://prod-db:3306/app" ``` 3. **与 Solon 热更新结合** 通过 `@RefreshScope` 实现配置动态更新: ```java @Bean @RefreshScope public DataSource dataSource(@Value("${jdbc.default}") HikariDataSource ds) { return ds; } ``` > **迁移原理**:Flyway 通过 `flyway_schema_history` 表记录迁移状态,每次启动时对比文件校验和决定是否执行新脚本[^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值