Liquibase

About Liquibase

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具;它将所有数据库的变化(包括结构和数据)都保存在文件中(见附录2),便于版本控制。

Liquibase 具备如下特性:

  • 不依赖于特定的数据库

    • supported databases (见附录1)

  • 提供数据库比较功能

    • 比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库

  • 多人协作

    • 以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作

  • 历史版本留痕

    • 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化 (ChangSet)

  • 回滚

    • 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态

  • 生成变化文档

    • 可生成数据库修改文档(HTML格式) (见Liquibase Command 章节

* How to used?

第一步 导入依赖

Gradle importbuild.gradle

Maven importpom.xml

第二步 配置springboot配置文件

Configuration application.yml

  • 需要在 application.yml中,增加liquibase配置

第三步 配置Liquibase部署文件

Configuration db.changelog.xml

  • db.changelog.xml中,配置初始化变化集changeSet、Tag标签、重大升级变化集changeSet等。

* 如何版本管理

通过TAG管理版本

怎么打TAG?

  • changeSet中,打版本标签<tagDatabase tag="version_0.7.0" />如下:

  • 每一个tagDatabase标签需要放在独立的changeSet中

TAG是怎么保证顺序的?

  • TAG顺序是按照classpath:config/liquibase/db.changelog.xml文件顺序

  • tag允许被字符串命名,建议与release number保持一致

  • rollback时,会回滚到指定tag之前的样子

版本升级

准备好即将升级的changeset脚本,详见【制作数据升级包

  • 手动升级

    • Gradle commands 执行此命令可以达到增量滚动升级脚本的目的

    • Maven commands 执行此命令可以达到增量滚动升级脚本的目的

  • 自动升级

    • 启动工程后,Liquibase会自动运行比较后,执行那些新增的changeSet,随后即可查看目标数据结构变化

      • 注意 此处 关闭 drop-first 避免业务销毁数据

  • 指定升级

版本回滚

  • Gradle commands 回滚到指定历史版本<tagDatabase tag="version_0.5.0" />

  • Maven commands 回滚到指定历史版本<tagDatabase tag="version_0.5.0" />

* Configuration ChangeSet

ChangeSet

ChangeSet 存储每个阶段变化的集合,即变更集;它有以下几个主要属性:

  • id :唯一标示,不得重复

  • runOnChange : 当changeSet内容发生改变时,执行此

  • runAlways :总是执行此changeSet

ChangeSet Supported

ChangeSet 下的功能

Description

e.g.

createTable

创建表

dropTable

销毁表

addColumn

加一列

modifyDataType

修改列

mergeColumns

合并列

dropColumn

销毁列

insert

插入数据

delete

删除数据

createIndex

创建索引

dropIndex

销毁索引

在changeSet下有一个非常重要的标签,rollback;它定义了回滚语句。

我要创建表结构

我要建索引

如何初始化数据

制作数据库升级包

  • addColumn 增加列

  • modifyDataType 修改列的数据类型或长度等

  • dropColumn 删除列定义

完整的 db.changelog.xml

Advanced Usage

Preconditions 条件判断

  • 简单判断

  • Will require running on Oracle OR MySQL which makes more sense than the above example.

Parameters 应用

  • oracle 和 mysql 在一些 type 命名是不一样的,可以通过此种方式做通用适配

Attribute

Description

name

Name of the table's schema required

value

Name of the column's table required

context

Contexts given as comma separated list.

dbms

Database types given as comma separated list.

Database “Diff”

http://www.liquibase.org/documentation/diff.html

Liquibase Command

反向生成 Liquibase from database

  • 将已有数据库结构生成liquibase.xml

生成变更文档

  • 将变更记录生成文档

  • 图示

比较 Diff

  • 比较两个数据库差异

  • 结果如下图所示,红框内为变化量:

More Command

http://www.liquibase.org/documentation/command_line.html

附录

1.Supported Databases

Database

Type Name

Notes

MySQL

mysql

No Issues

PostgreSQL

postgresql

8.2+ is required to use the "drop all database objects" functionality.

Oracle

oracle

11g driver is required when using the diff tool on databases running with AL32UTF8 or AL16UTF16

Sql Server

mssql

No Issues

Sybase_Enterprise

sybase

ASE 12.0+ required. "select into" database option needs to be set. Best driver is JTDS. Sybase does not support transactions for DDL so rollbacks will not work on failures. Foreign keys can not be dropped which can break the rollback or dropAll functionality.

Sybase_Anywhere

asany

Since 1.9

DB2

db2

No Issues. Will auto-call REORG when necessary.

derby

No Issues

HSQL

hsqldb

No Issues

H2

h2

No Issues

informix

No Issues

Firebird

firebird

No Issues

sqlite

No Issues

2.Works with You

Configuration Gradle build.xml

Q&A

如何在Development、Test、CI&CD、Production等环境下,选择性使用Liquibase

只需要在@configuration 配置一套关于所在环境决定开启Liquibase即可,代码如下:

CI&CD 如果与生产环境不同该如何处理?

  1. 准备CI&CD环境配置,准备CI&CD数据库,以便与生产网络不通时,让CI&CD可以继续运行,不至于阻塞;

  2. 而到了生产部署时,liquibase.enabled: true 只需开启,便会自动执行滚动升级

TAG版本号如何管理?

  1. 版本号是字符串,建议根据release number设定,tagDatabase是按文件顺序切割版本,所以rollback时,注意changeset顺序即可。

Last updated

Was this helpful?