Spring Boot中FlywayDB迁移历史表恢复及flywayRepair报错处理
问题解决步骤
1. 先修复flywayRepair的执行错误
你遇到的Configuration with name 'compile' not found是因为旧版Flyway Gradle插件(5.2.4)依赖已被Gradle废弃的compile配置,而新版Java插件默认不再生成该配置。解决方法是在build.gradle中手动声明compile配置:
// 在plugins块之后添加 configurations { compile }
修改后重新执行gradle flywayRepair -i,即可正常运行该命令。flywayRepair的作用是修复schema_history表中记录的校验和与本地脚本的一致性,避免后续校验失败,但它无法自动恢复被删除的历史行。
2. 手动恢复被删除的迁移历史行
Flyway报错column ... already exists,是因为它认为对应的迁移脚本从未执行过(历史表中无记录),但实际上该脚本已经被执行过,数据库中已有对应的结构。你需要手动将被删除的那行数据插回schema_history表:
具体操作:
获取迁移脚本关键信息:
找到被删除的迁移文件(比如V1__create_user_table.sql),记录以下信息:version:文件名中的版本号(例如1)description:文件名中版本后的描述(例如create_user_table)script:完整脚本文件名(例如V1__create_user_table.sql)checksum:执行gradle flywayInfo -i,输出中会显示每个本地脚本的Checksum值,直接取用即可。
插入历史记录:
连接PostgreSQL数据库,执行以下插入语句(根据实际数据调整参数):INSERT INTO schema_history ( installed_rank, version, description, type, script, checksum, installed_by, installed_on, execution_time, success ) VALUES ( 2, -- 注意:此值需与现有历史记录的顺序对应,比如现有最后一条的installed_rank是1,这里就填2 '1', 'create_user_table', 'SQL', 'V1__create_user_table.sql', 123456789, -- 替换为flywayInfo输出的checksum '你的数据库用户名', NOW(), 100, -- 执行时间填合理值即可 true -- 标记为执行成功 );
3. 验证修复结果
执行gradle flywayInfo,如果输出中所有本地脚本的状态都显示为Success,说明历史表已恢复正常,此时再添加新的迁移脚本即可正常执行。
内容的提问来源于stack exchange,提问作者skyho
相关产品推荐
相关产品推荐

