前言
为什么会使用Liquibase工具呢?最开始我们公司项目的环境,也是通过SQL来定义表结构,增加表字段或者修改表结构都是维护在一个SQL文件里。公司项目默认使用的数据库是Oracle11。但随着项目的迭代,不同家客户要求不一样。
有的客户使用Oracle,有的客户使用Mysql,有的客户希望支持信创,使用国产数据库,例如达梦或者OacenBase数据库。因此我们的的表结构定义不得不调整,支持多套数据库。
Liquibase把表结构的定义维护在一个xml文件中(我们公司使用的是XML,也可以是yml)。然后指定数据库类型,他会根据不同的数据库,生成不同的表结构语句。
一、什么是Liquibase
Liquibase 是一个开源的数据库变更管理工具,支持多种数据库(如 MySQL、PostgreSQL、Oracle 等),通过与SpringBoot集成,Liquibase提供了便捷的数据库迁移和版本控制功能。主要特点包括:
- 数据库变更版本控制:通过文件记录每一次数据库的变更,确保版本可追溯。
- 跨环境同步:开发、测试、生产环境的数据库可以轻松保持一致。
- 自动生成 SQL:根据定义的变更文件自动生成数据库 SQL 语句。
- 回滚支持:可以轻松撤销特定版本的变更。
- 与 CI/CD 集成:支持和 Jenkins、GitLab 等工具集成。
二、核心概念
Changelog(变更日志)
记录数据库变更的文件,通常以 XML、JSON 或 YAML 格式定义。
Changeset(变更集)
变更日志中的每一个具体数据库更改单元(如添加表、修改列)。
Liquibase CLI
命令行工具,用于执行 Liquibase 操作。
Databasechangelog 表
在目标数据库中,Liquibase 会创建一张名为 DATABASECHANGELOG 的表,用于记录已经应用的变更集。
三、Liquibase基本使用
这里主要说一下Liquibase和SpringBoot的集成。
步骤:
1、引入依赖
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
- 配置
application.yml:
spring:
liquibase:
enabled: true
change-log: classpath:db/changelog/db.changelog-master.xml
- 创建
db.changelog-master.xml文件:
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">
<include file="db/changelog/db.changelog-1.0.xml"/>
<include file="db/changelog/db.changelog-1.1.xml"/>
</databaseChangeLog>
- 创建分步变更日志:
<changeSet id="1" author="developer">
<createTable tableName="orders">
<column name="id" type="INT" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="amount" type="DECIMAL(10,2)">
<constraints nullable="false"/>
</column>
</createTable>
</changeSet>
启动 Spring Boot 项目时,Liquibase 将自动应用变更。
四、常见问题
1、问题:多次运行 update 会重复执行变更吗?
解决方案:不会,Liquibase 会在 DATABASECHANGELOG 表中记录已应用的变更集。
2、问题:如何处理生产环境的敏感变更(如删除表)?
解决方案:通过 preconditions 添加验证条件,确保变更前环境符合要求。
3、问题:如何处理变更冲突?
解决方案:通过 context 将变更限制在特定环境下执行。