
前言Flyway 是一款开源数据库版本迁移管理工具基于 Java 开发无缝集成 Spring Boot 主流生态核心目标是解决多环境本地 /dev/ 测试 / 预发 / 生产MySQL 表结构不一致、SQL 上线无追溯、手动执行脚本易出错、回滚困难等研发痛点是国内后端企业数据库迭代标准方案之一。 全文采用多表格结构化拆解覆盖基础概念、命名规范、配置、执行原理、实操、坑点对比、生产规范全维度内容。一、Flyway 核心基础概念总览表术语详细释义作用迁移脚本 (Migration Script)存放在项目resources/db/migration目录下的 SQL 文件是数据库变更最小单元记录每一次建表、加字段、改索引、初始化数据操作版本表flyway_schema_historyFlyway 自动在目标库创建的系统记录表1. 记录所有已执行脚本版本、执行时间、执行状态、哈希校验值 2. 启动时对比脚本与历史记录判断是否需要执行迁移基线 (Baseline)项目接入 Flyway 前数据库已存在存量表结构初始化历史版本记录的操作存量老项目无缝接入 Flyway不用重新初始化库迁移 (Migrate)核心动作启动项目自动扫描未执行脚本按版本顺序依次执行 SQL所有环境统一表结构的核心能力校验 (Validate)启动时校验本地脚本文件哈希值和历史执行记录哈希是否一致防止已上线脚本被私自修改规避环境错乱清理 (Clean)清空库内所有表、视图、存储过程生产环境严禁使用仅本地调试重置数据库使用修复 (Repair)修复版本表异常记录、哈希不一致、迁移失败中断残留数据解决迁移中途报错导致的版本状态错乱二、版本脚本分类 命名规则对照表Flyway 依靠文件名区分脚本类型格式严格固定大小写敏感不允许自定义格式2.1 四大脚本类型完整对比脚本前缀标识脚本类型执行时机适用场景命名示例V版本迁移脚本Versioned仅执行 1 次执行完毕永久锁定不会重复执行建表、新增字段、修改字段、创建索引、基础字典初始化数据V1__init_base_table.sqlV2__add_staff_column.sqlU撤销回滚脚本Undo版本脚本执行成功后执行 U 脚本可撤销对应 V 脚本变更社区免费版不推荐、功能残缺仅商业 Pro 版完整支持U2__undo_add_staff_column.sqlR可重复执行脚本Repeatable每次项目启动都会执行文件修改即触发执行视图、存储过程、函数、定时任务 SQL、动态配置字典数据R__view_staff_role.sqlR__init_menu_data.sqlB基线脚本Baseline存量老项目初始化基线使用已有大量数据表的老系统接入 FlywayB1__baseline_exist_tables.sql2.2 强制命名语法拆分通用格式前缀版本号__描述文字.后缀分隔符两个下划线__固定分隔版本号与描述单下划线无效版本号数字可分段V1.1.2__xxx.sql按数字大小升序执行描述文字英文 / 下划线禁止中文空格后缀.sql标准 SQL 脚本支持.javaJava 代码迁移复杂动态逻辑。2.3 脚本执行优先级规则先按数字从小到大执行所有V版本脚本全部 V 脚本执行完成后执行所有R可重复脚本Undo 脚本仅商业版可用免费版无回滚能力。三、Spring Boot application.yml 全配置参数明细表格适配 SpringBoot2/3 通用配置标注必填项与使用场景配置 Key默认值取值说明适用场景spring.flyway.enabledtruetrue开启迁移false关闭本地临时调试可关闭线上必须开启spring.flyway.locationsclasspath:db/migration脚本扫描路径多路径逗号分隔拆分模块脚本、公共脚本存放spring.flyway.baseline-on-migratefalsetrue无版本表时自动创建基线存量老项目接入必备配置spring.flyway.validate-on-migratetrue启动校验脚本哈希一致性线上必须开启防止脚本篡改spring.flyway.clean-disabledfalsetrue禁用 clean 清空库能力生产环境强制开启杜绝误删库spring.flyway.tableflyway_schema_history修改版本记录表名多数据源、分库场景自定义spring.flyway.encodingUTF-8SQL 文件编码统一中文不乱码spring.flyway.out-of-orderfalsetrue允许执行更高版本脚本跳过缺失低版本紧急线上补丁临时开启日常关闭spring.flyway.placeholders-占位符变量替换多环境库名、前缀差异化配置四、Flyway 项目启动完整生命周期执行流程拆解表项目启动 → Spring 容器初始化 → Flyway 自动触发7 步标准流程步骤序号执行动作内部逻辑1数据源加载读取 spring.datasource 配置建立 MySQL 连接2校验库内是否存在flyway_schema_history版本表不存在触发 baseline 基线初始化存在读取所有历史执行记录3扫描项目路径下所有 SQL 脚本区分 V/U/R/B 四类脚本按版本号排序4Validate 哈希校验对比本地脚本哈希值 和 版本表存储哈希不一致直接启动报错5Migrate 迁移执行筛选版本号大于历史最大版本的 V 脚本按顺序逐条执行执行成功写入版本表6执行所有 R 可重复脚本每次启动均执行更新视图、存储过程7SpringBoot 项目正常启动完成接口可正常访问数据库表五、Flyway vs Liquibase 主流数据库迁移工具横向对比表二者均为行业主流选型核心差异如下对比维度FlywayLiquibase核心设计思想约定优于配置纯 SQL 编写学习成本极低基于 XML/YAML/JSON 结构化定义跨数据库兼容极强脚本编写形式原生 SQL贴合 DBA 日常习惯自定义标签语法可自动生成多数据库适配 SQL回滚能力免费版无完整回滚依赖备份 正向补丁原生支持任意版本一键回滚执行速度轻量小巧启动速度快功能繁多启动开销略大国内企业使用率绝大多数 Java 后端项目首选外企、多数据库适配项目使用居多学习门槛极低开发 1 小时即可上手偏高需要记忆专属标签语法复杂场景适配简单迭代、MySQL 单库最优分库分表、Oracle/PostgreSQL 多数据库异构场景✅ 选型结论仅使用 MySQL、中小团队日常迭代 → 优先 Flyway六、Flyway 常用命令行操作清单表除了项目启动自动迁移可通过 maven 命令手动执行所有能力Maven 命令功能使用场景mvn flyway:migrate手动执行迁移脚本打包前本地验证 SQL 执行效果mvn flyway:validate单独执行哈希校验排查脚本篡改、版本不一致问题mvn flyway:clean清空数据库所有表本地调试重置库线上禁止执行mvn flyway:baseline手动初始化基线版本老项目初次接入初始化mvn flyway:repair修复版本表异常记录迁移中途报错、执行失败后修复状态mvn flyway:info查看所有脚本执行状态排查哪些脚本未执行、执行失败七、日常开发迭代场景实操对照表贴合你开发员工权限系统的真实场景开发场景标准操作流程禁忌操作新建角色表、菜单表新建V1__create_sys_role_menu.sql编写建表语句启动项目自动建表Navicat 手动在 dev 库建表不写入项目脚本角色表新增排序字段新建V2__add_sort_column_to_role.sqlALTER TABLE 语句新增字段修改 V1 脚本内原有 SQL 内容创建角色分页查询视图新建R__view_role_page.sql编写 VIEW 视图写在 V 脚本中导致视图无法迭代更新给角色初始化 3 条基础测试数据写入 V 版本脚本一次性初始化正式字典数据放 R 脚本每次启动重复 INSERT 插入测试数据存量老项目接入 Flyway开启baseline-on-migratetrue启动自动生成基线手动创建 flyway_schema_history 表填写记录八、高频报错、根因与解决方案对照表报错信息根因解决方案Validate failed: checksum mismatch已上线执行过的 V 脚本被本地修改哈希值不一致1. 本地未提交恢复脚本原始内容 2. 已上线执行mvn flyway:repair修复哈希Found non-empty schema without metadata table库内已有数据表无 Flyway 版本表开启baseline-on-migrate: true自动基线Migration failed: SQL error in scriptSQL 语法错误、字段冲突、主键重复查看控制台 SQL 异常日志修正脚本后 repair 重试Unknown column xxx脚本执行顺序错乱前置表未创建严格保证版本号递增禁止随意调整脚本顺序connect refused 数据库连接失败数据源地址、账号密码错误VPN 未连通核对 application.yml 数据库配置连通内网 VPN九、生产环境上线 回滚标准规范表线上环境严禁随意操作统一规范环节执行规范安全约束上线发布1. 脚本提交 Git dev 分支 2. Jenkins 流水线打包部署 3. 服务启动自动执行 migrate 4. 查看启动日志确认全部脚本执行成功上线前必须本地完整验证 SQL 执行效果线上结构变更所有 DDL 语句建表、加字段、改索引均新增高版本 V 脚本禁止 DBA 直连生产库手动执行 ALTER 语句线上回滚方案免费版无 undo方案 1正向新增 V 回滚脚本推荐 方案 2上线前全量备份数据库异常时回档备份不依赖 Undo 脚本做线上回滚大表字段新增拆分小批次脚本避开业务高峰期执行上亿条大表禁止高峰执行 DDL锁表阻塞业务权限管控生产账号仅拥有 DML 读写权限DDL 变更全权交由 Flyway 执行DBA 日常不持有生产库超级管理员权限十、核心总结Flyway 核心精髓SQL 即代码版本化管控约定大于配置免费版核心短板无原生回滚依靠正向迭代 数据库备份保障线上安全研发标准链路本地编写 SQL 脚本→启动验证→提交 Git→流水线发布→全环境自动同步表结构彻底解决多环境库不一致问题适配你的项目后续所有建表、权限结构调整全部通过 Flyway 脚本管理对接 dev 数据库后本地启动服务即可生成数据表Apifox 接口就能正常查询数据。