Liquibase
About Liquibase
LiquibaseLiquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具;它将所有数据库的变化(包括结构和数据)都保存在文件中(见附录2),便于版本控制。
Liquibase 具备如下特性:
Liquibase 具备如下特性:不依赖于特定的数据库
supported databases (见附录1)
提供数据库比较功能
比较结果保存在XML中,基于该XML你可用Liquibase轻松部署或升级数据库
多人协作
以XML存储数据库变化,其中以作者和ID唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作
历史版本留痕
在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化 (ChangSet)
回滚
提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态
生成变化文档
可生成数据库修改文档(HTML格式) (见
Liquibase Command 章节)
* How to used?
第一步 导入依赖
Gradle importbuild.gradle
build.gradleMaven importpom.xml
pom.xml第二步 配置springboot配置文件
springboot配置文件Configuration application.yml
application.yml需要在
application.yml中,增加liquibase配置
第三步 配置Liquibase部署文件
Liquibase部署文件Configuration db.changelog.xml
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
db.changelog.xmlAdvanced 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”
Liquibase Command
反向生成 Liquibase from database
Liquibase from databaseview
liquibase

将已有数据库结构生成
liquibase.xml
生成变更文档
将变更记录生成文档
图示

比较 Diff
Diff比较两个数据库差异
结果如下图所示,红框内为变化量:

More Command
附录
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.
HSQL
hsqldb
No Issues
H2
h2
No Issues
Firebird
firebird
No Issues
2.Works with You
Supports code branching and merging
Supports multiple developers
Supports multiple database types
Supports context-dependent logic
Cluster-safe database upgrades
Generate Database change documentation
Generate Database "diffs"
Run through your build process, embedded in your application or on demand
Automatically generate SQL scripts for DBA code review
Does not require a live database connection
Configuration Gradle build.xml
Gradle build.xmlQ&A
如何在Development、Test、CI&CD、Production等环境下,选择性使用Liquibase?
Liquibase?只需要在@configuration 配置一套关于所在环境决定开启Liquibase即可,代码如下:
CI&CD 如果与生产环境不同该如何处理?
准备CI&CD环境配置,准备CI&CD数据库,以便与生产网络不通时,让CI&CD可以继续运行,不至于阻塞;
而到了生产部署时,
liquibase.enabled: true只需开启,便会自动执行滚动升级
TAG版本号如何管理?
版本号是字符串,建议根据
release number设定,tagDatabase是按文件顺序切割版本,所以rollback时,注意changeset顺序即可。
Last updated
Was this helpful?