Spring项目中Flyway undo命令失效,求助回滚失败迁移
解决Flyway失败迁移的回滚问题
问题背景
Spring项目使用Flyway Community Edition 9.8.1管理数据库迁移,因SQL列名拼写错误导致V5版本迁移失败。尝试执行flyway undo回滚时,提示该命令仅支持Flyway专有版本,无法执行。迁移历史显示版本5状态为Failed (Future)且Undoable = No。
命令执行报错
C:\Users\leonardo.freitas\Documents\workspace\api>C:\Users\leonardo.freitas\Documents\workspace\flyway-9.8.1\flyway undo A new version of Flyway is available Upgrade to Flyway 9.8.2: https://rd.gt/2X0gakb ERROR: The command 'undo' was not recognized. Make sure you have added 'flyway-proprietary' as a dependency. Caused by: No command extension found to handle command: undo
迁移历史
C:\Users\leonardo.freitas\Documents\workspace\api>C:\Users\leonardo.freitas\Documents\workspace\flyway-9.8.1\flyway info A new version of Flyway is available Upgrade to Flyway 9.8.2: https://rd.gt/2X0gakb Flyway Community Edition 9.8.1 by Redgate See what's new here: https://flywaydb.org/documentation/learnmore/releaseNotes#9.8.1 ERROR: Skipping filesystem location: sql (not found) Database: jdbc:mysql://localhost:3306/volimed (MySQL 8.0) Schema version: 5 +-----------+---------+----------------------------------------+------+---------------------+-----------------+----------+ | Category | Version | Description | Type | Installed On | State | Undoable | +-----------+---------+----------------------------------------+------+---------------------+-----------------+----------+ | Versioned | 1 | create-table-medicos | SQL | 2022-11-19 03:12:19 | Future | No | | Versioned | 2 | alter-table-medicos-add-telefone | SQL | 2022-11-19 13:32:45 | Future | No | | Versioned | 3 | create-table-pacientes | SQL | 2022-11-19 13:46:17 | Future | No | | Versioned | 4 | alter-table-medicos-add-column-active | SQL | 2022-11-19 15:28:46 | Future | No | | Versioned | 5 | alter-table-paciente-add-column-active | SQL | 2022-11-19 15:45:28 | Failed (Future) | No | +-----------+---------+----------------------------------------+------+---------------------+-----------------+----------+
解决方案
Flyway Community版不支持undo命令,针对当前失败的迁移,按以下步骤处理:
1. 确认数据库实际状态
连接到MySQL的volimed数据库,检查paciente表是否已添加active列:
DESCRIBE paciente;
如果列不存在,说明迁移完全失败,无需手动回滚数据库变更;如果列存在,先执行删除列的SQL:
ALTER TABLE paciente DROP COLUMN active;
2. 修正Flyway元数据
Flyway的元数据表(默认是flyway_schema_history)中存在版本5的失败记录,需要删除该记录解除锁定:
DELETE FROM flyway_schema_history WHERE version = '5';
3. 修复迁移脚本错误
找到V5对应的SQL脚本(V5__alter-table-paciente-add-column-active.sql),修正列名拼写错误,确保SQL语句合法。
4. 重新执行迁移
运行Flyway迁移命令,重新执行修正后的脚本:
flyway migrate
补充说明
undo是Flyway Pro/Enterprise版的专属功能,Community版无法使用,无需尝试添加flyway-proprietary依赖(除非升级到付费版本)。- 后续建议在测试环境先验证迁移脚本,避免因语法错误导致生产环境迁移失败。
内容的提问来源于stack exchange,提问作者Léo Freitas
相关产品推荐
相关产品推荐

