集成Flyway至已手动迁移的生产库:是否会从头执行所有迁移?
Flyway集成后执行逻辑说明
Flyway默认只会执行未被数据库历史表记录的新增迁移脚本,不会从头执行你之前手动在生产库跑过的脚本——但前提是你得做好关键配置,避免踩坑。
核心机制:靠历史表追踪执行记录
Flyway会在数据库里自动维护一张flyway_schema_history表(旧版本叫schema_version),里面存着所有已成功执行的迁移脚本的版本号、执行时间、状态等信息。
启动时,Flyway会扫描你配置的脚本目录,把所有脚本的版本号和这张表里的记录做对比:
- 只有那些不在历史表中、且版本号高于现有最高版本的脚本,才会被执行。
- 已经手动执行过的脚本,只要版本号和代码里的对应脚本完全一致,Flyway会判定为已执行,不会重复运行。
必须注意的配置细节(防误执行)
- 脚本版本号完全匹配:手动执行过的脚本,其文件名(比如
V1__create_user_table.sql)的版本号、描述文字必须和代码仓库里的完全一致——哪怕多一个空格、大小写不一样,Flyway都会当成新脚本执行,大概率会破坏数据。 - 正确初始化历史表:如果生产库还没这张历史表,别直接启动应用让Flyway自动跑,用
flyway baseline命令(或者配置flyway.baselineOnMigrate=true),指定一个基线版本,把你已经手动执行的脚本标记为“已完成”。
举个例子:你已经手动跑了V1到V5的脚本,就设置flyway.baselineVersion=5,Flyway会把这些版本记录到历史表,之后只执行V6及以后的新增脚本。 - 禁用自动清理:一定要把
flyway.cleanDisabled=true打开,这个配置能阻止Flyway在版本不匹配时清空整个数据库,彻底避免数据丢失风险。
风险场景规避
- 如果代码里的脚本和你手动执行的内容不一样(比如手动改了脚本但没同步到代码),Flyway会检测到版本冲突,直接抛出错误不会执行,这时候你得手动修复脚本或者调整历史表的记录。
- 如果不小心删了
flyway_schema_history表,Flyway会认为所有脚本都没执行,这时候必须重新用baseline命令初始化,绝对不能直接启动应用。
内容的提问来源于stack exchange,提问作者Sam Fisher
相关产品推荐
相关产品推荐

