Liquibase 数据库版本控制

579 阅读2分钟

前言

为什么会使用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>

  1. 配置 application.yml
spring:
  liquibase:
    enabled: true
    change-log: classpath:db/changelog/db.changelog-master.xml
  1. 创建 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>
  1. 创建分步变更日志:
<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 将变更限制在特定环境下执行。