推荐使用Liquibase或Flyway实现数据库变更的版本化、自动化管理:Liquibase支持多格式定义、校验和、回滚及Spring Boot深度集成;Flyway更轻量、强调“只向前”,适合纯SQL场景;两者均需将脚本纳入源码版本控制,启动时自动执行并失败中断,确保变更可追溯、可复现、可协作。

Java 应用在数据库结构变更(如加字段、改类型、建索引)时,需确保每次部署都能自动、安全地执行对应 SQL 脚本。核心思路是:把数据库变更当作版本化代码来管理,并由应用启动时按序执行未执行过的脚本。
选一个成熟的迁移框架
手动写“判断表是否存在再执行 DDL”的逻辑极易出错且难以维护。推荐使用经过广泛验证的开源工具:
-
Liquibase:支持 XML/YAML/JSON/Java DSL 多种格式定义变更;自带校验和防重复执行;可生成差异脚本、回滚、打标签;与 Spring Boot 深度集成(
spring-boot-starter-liquibase)。 -
Flyway:更轻量,强调“只向前”(默认不支持自动回滚);脚本以
V1__init.sql、V2__add_user_status.sql命名,按版本号顺序执行;对 SQL 脚本语法兼容性好,适合 DBA 主导的纯 SQL 场景。
统一管理脚本位置和命名规范
无论用哪个框架,脚本必须纳入项目源码,和 Java 代码一起版本控制:
- Flyway 默认扫描
src/main/resources/db/migration/下的.sql文件,命名格式为V{版本号}__{描述}.sql(如V1_20240501__create_order_table.sql)。 - Liquibase 推荐用
changelog-master.xml作为入口,逐层 include 具体变更文件(如changelog-1.0.xml),每个变更块带唯一id和author,避免冲突。 - 禁止在多个分支并行修改同一张表的脚本——应通过合并前协调或使用“特性开关+空迁移”规避。
集成到 Spring Boot 启动流程
让迁移在应用启动时自动触发,失败则直接中断启动,避免带旧结构运行:
- Flyway:引入依赖后,默认开启;可通过
spring.flyway.enabled=true显式启用,spring.flyway.baseline-on-migrate=true用于已有库首次接入。 - Liquibase:添加
spring.liquibase.enabled=true,指定主配置文件路径:spring.liquibase.change-log=classpath:db/changelog-master.xml。 - 生产环境建议关闭自动修复(如 Flyway 的
repair或 Liquibase 的drop-all),所有变更走评审 + 脚本 + 测试流程。
处理特殊情况:多数据源、灰度发布、回滚需求
复杂场景需额外设计:
- 多数据源:为每个数据源单独配置 Liquibase/Flyway Bean,指定不同
dataSource和changeLog路径。 - 灰度发布:避免新旧版本应用同时操作数据库。可在迁移脚本中加入“仅当表存在且无某字段时才执行 ADD COLUMN”,或使用数据库原生的条件 DDL(如 MySQL 8.0+ 的
ALTER TABLE ... ADD COLUMN IF NOT EXISTS)。 - 回滚:Flyway 社区版不支持自动回滚,需手写
R前缀脚本(如R__revert_add_index.sql)并启用spring.flyway.clean-disabled=false(慎用);Liquibase 支持rollback命令,但要求每个变更块定义rollback子段。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











