如何将迁移记录写入flyway_schema_history表而不执行数据库迁移?
针对Flyway历史记录丢失的修复方案
一、先排查Flyway Repair的正确使用方式
你说repair没成功,大概率是命令参数没配对或者脚本状态不匹配。正确的repair命令需要指定数据库连接信息,让Flyway能对比本地脚本和数据库实际状态:
- CLI执行示例:
flyway repair -url=jdbc:mysql://localhost:3306/your_db -user=root -password=your_pwd - 这个命令的逻辑是:Flyway扫描本地迁移脚本,计算校验和后和数据库现有记录对比,自动修复
flyway_schema_history中缺失或不匹配的记录。但如果你的本地脚本已经被修改过(和当初实际执行的版本不一致),repair就无法匹配,会失败。
二、手动插入历史记录(直接写入flyway_schema_history)
如果repair无效,最直接的办法就是手动往历史表插记录,步骤如下:
- 准备好要恢复的迁移脚本的关键信息:
version:脚本中的版本号(比如V2__rename_user_column.sql里的2)description:脚本的描述部分(比如rename_user_column)type:SQL脚本填SQL,Java迁移填JAVAscript:脚本文件名(或Java类全限定名)checksum:用flyway calculateChecksum -filename=/path/to/your/migration.sql命令生成脚本的校验和installed_by:当初执行迁移的数据库用户名installed_on:可以填当前时间,或者你实际执行迁移的时间(用对应数据库的时间函数,比如MySQL用NOW(),PG用CURRENT_TIMESTAMP)execution_time:随便填个合理的毫秒数就行(比如100)success:设为1(因为迁移已经成功执行)
- 执行INSERT语句插入记录,示例(MySQL):
INSERT INTO flyway_schema_history (version, description, type, script, checksum, installed_by, installed_on, execution_time, success) VALUES ('2', 'rename_user_column', 'SQL', 'V2__rename_user_column.sql', 123456789, 'db_admin', NOW(), 100, 1);
三、用Flyway Baseline批量恢复旧记录
如果丢失的是一批较早的迁移记录,用baseline更高效:
- 确定基线版本:比如你删除了V1到V5的记录,当前数据库已经是V6及之后的状态,就把基线版本设为V5
- 执行baseline命令:
flyway baseline -url=jdbc:your_db_url -user=your_user -password=your_pwd -baselineVersion=5 -baselineDescription="Restore deleted migrations baseline" - 这个命令会往
flyway_schema_history插入一条基线记录,标记当前数据库状态对应V5版本,后续Flyway只会执行V6及之后的迁移脚本,不会再处理V1-V5的内容。
注意事项
- 手动插记录前,必须保证本地脚本和当初实际执行的版本完全一致,否则后续Flyway校验checksum会报错
- 操作
flyway_schema_history表前,先备份该表,避免误操作 - Java迁移的
script字段要填类的全限定名(比如com.example.migrations.V2_RenameUserColumn),checksum同样用flyway calculateChecksum生成
内容的提问来源于stack exchange,提问作者Aspiring Dev
相关产品推荐
相关产品推荐

