在软件开发中,数据库结构的变更管理是一个不可忽视的重要环节。随着微服务架构和持续集成/持续部署(CI/CD)流程的普及,如何高效、安全地管理数据库 schema 的演进成为开发团队面临的关键挑战。Liquibase 作为一款开源的数据库版本控制工具,有其灵活性、跨数据库支持以及与主流开发框架的深度集成能力。
什么是 Liquibase?
Liquibase 是一个用于跟踪、管理和应用数据库变更的开源工具。它允许开发者以代码形式(称为“ChangeLog”)定义数据库结构的变化(如创建表、添加字段、修改约束等),并通过版本控制这些变更文件,实现数据库 schema 的可重复部署和回滚。
核心特性
- 多数据库支持:支持超过 20 种主流数据库,包括 MySQL、PostgreSQL、Oracle、SQL Server、H2、SQLite 等。
- 多种格式支持:变更日志可编写为 XML、YAML、JSON 或 SQL 格式,适应不同团队偏好。
- 版本控制友好:变更文件可纳入 Git 等版本控制系统,实现团队协作与审计追踪。
- 回滚能力:每个变更均可定义回滚策略,支持安全撤销操作。
- 上下文与环境隔离:支持按环境(dev/test/prod)或标签(label)条件执行特定变更。
- 与 CI/CD 无缝集成:可嵌入 Jenkins、GitLab CI、GitHub Actions 等自动化流程。
Liquibase 核心概念
1. ChangeLog(变更日志)
ChangeLog 是 Liquibase 的核心配置文件,包含一系列有序的
示例(YAML 格式):
databaseChangeLog: - changeSet: id: create-user-table author: dev-team changes: - createTable: tableName: user columns: - column: name: id type: bigint autoIncrement: true constraints: primaryKey: true - column: name: username type: varchar(50) constraints: nullable: false - column: name: email type: varchar(100)2. ChangeSet(变更集)
每个 changeSet 具有唯一标识(由 id + author 组成),确保不会重复执行。Liquibase 会在数据库中维护一张 DATABASECHANGELOG 表,记录已执行的变更集。
3. Precondition(前置条件)
可在 changeSet 中定义前置条件,只有满足条件时才执行该变更。例如:仅在 MySQL 8+ 版本执行某项优化。
4. Rollback(回滚)
每个 changeSet 可选定义 rollback 策略,用于在部署失败或需要撤销时恢复数据库状态。
Liquibase 与 Spring Boot 集成实战
Spring Boot 提供了对 Liquibase 的原生支持,只需引入依赖并进行简单配置,即可实现启动时自动执行数据库迁移。
步骤 1:添加 Maven 依赖
在 pom.xml 中加入以下依赖:
org.liquibase liquibase-core 4.29.0 <!-- 请使用最新稳定版 --> <!-- 如果使用 YAML 格式的 changelog,无需额外依赖;若用 XML/JSON 也原生支持 -->提示:Spring Boot 会自动管理 Liquibase 版本,通常无需显式指定版本号,除非需要特定功能。
步骤 2:配置 application.yml
在 src/main/resources/application.yml 中添加如下配置:
spring: datasource: url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver liquibase: enabled: true change-log: classpath:/db/changelog/db.changelog-master.yaml contexts: dev # 可选:指定运行环境上下文 default-schema: mydb # 可选:指定默认 schema步骤 3:创建变更日志文件
在 src/main/resources/db/changelog/ 目录下创建主日志文件 db.changelog-master.yaml:
databaseChangeLog: - includeAll: path: /db/changelog/changes/ pattern: "*.yaml" relativeToChangelogFile: false然后在 changes/ 子目录中创建具体变更文件,如 001-create-user-table.yaml
步骤 4:启动应用并验证
启动 Spring Boot 应用后,Liquibase 会自动:
- 连接数据库;
- 检查 DATABASECHANGELOG 表是否存在,若不存在则创建;
- 对比本地 changelog 与数据库中已执行的变更集;
- 执行未应用的变更集;
- 将执行结果写入 DATABASECHANGELOG 表。
你可以通过查询数据库确认变更是否成功:

SELECT * FROM DATABASECHANGELOG ORDER BY DATEEXECUTED;高级用法技巧
1. 使用 Profile 区分环境
结合 Spring Profile,可为不同环境加载不同的 changelog:
# application-dev.ymlspring: liquibase: contexts: dev# application-prod.ymlspring: liquibase: contexts: prod在 changelog 中使用
- changeSet: id: add-index-for-prod author: dba contextFilter: prod changes: - createIndex: indexName: idx_user_email tableName: user columns: - column: name: email自定义 Liquibase Bean
如需动态生成 changelog 或拦截执行过程,可自定义 SpringLiquibase Bean:
@Configurationpublic class LiquibaseConfig { @Bean public SpringLiquibase liquibase(DataSource dataSource) { SpringLiquibase liquibase = new SpringLiquibase(); liquibase.setDataSource(dataSource); liquibase.setChangeLog("classpath:/db/changelog/custom-changelog.yaml"); liquibase.setContexts("custom-context"); return liquibase; }}命令行独立运行 Liquibase
除集成 Spring Boot 外,也可通过 CLI 或 Maven 插件独立执行迁移:
liquibase --url=jdbc:mysql://localhost/mydb \ --username=root \ --password=secret \ --changeLogFile=db/changelog/db.changelog-master.yaml \ updateMaven 方式:
org.liquibase liquibase-maven-plugin 4.29.0 src/main/resources/liquibase.properties Liquibase 作为成熟的数据库版本控制工具,不仅解决了传统手动执行 SQL 脚本带来的混乱与风险,更通过与 Spring Boot 的深度集成,实现了“代码即基础设施”的 DevOps 理念。它将数据库变更纳入版本管理体系,使团队协作更高效、部署更可靠、回滚更安全。Github开源地址为:https://github.com/liquibase/liquibase