前言
研发过程中经常涉及到数据库变更,对表结构的修复及对数据的修改,为了保证各环境都能正确的进行变更,我们可能需要维护一个数据库升级文档来保存这些记录,有需要升级的环境按文档进行升级。
这样手工维护有几个缺点:
1.
无法保证每个环境都按要求执行
2.
遇到问题不一定有相对的回滚语句
3.
无法自动化
为了解决这些问题,我们进行了一些调研,主要调研对象是
Liquibase
和
Flyway
,我们希望通过数据库版本管理工具实现以下几个目标:
1.
数据库升级
2.
数据库回滚
3.
版本标记
Liquibase
还是
Flyway
Flyway
和
Liquibase
都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库模式的版本以及它是否与软件版本匹配。两种工具都集成在
Maven
或
Gradle
构建脚本中以及
Spring Boot
生态系统中,因此您可以完全自动化数据库重构。
Flyway
使用
SQL
定义数据库更改,因此您可以定制
SQL
脚本,使其与基础数据库技术(例如
Oracle
或
PostgreSQL
)良好地配合使用。另一方面,使用
Liquibase
,您可以通过使用
XML
,
YAML
或
JSON
来定义数据库更改来引入抽象层。因此,
Liquibase
更适合在具有不同基础数据库技术的不同环境中安装的软件产品中使用。
Flyway
数据库的变更可以用
SQL
或者
Java
来记录,
Flyway
通过下面的步骤实现数据库变更:
1.
Flyway
先在数据库中检查自己的元数据表(默认为
SCHEMA_VERSION
)是否存在,如果没有,则创建一个;
2.
检查
classpath
中所有的变更;
3.
对比变更和自己的表,如果变更的版本低于或等于当前版本,不做任何变动;
4.
否则,变更会按从低到高排序,并依次执行;
5.
执行完,在
SCHEMA_VERSION
做相应的记录
Liquibase
工作方式与
Flyway
非常类似,但是
Liquibase
稍微复杂点,这点后续会单独介绍。
对比
两者的基本功能其实都差不多:
•
都是
Java
开发的开源数据库变更管理工具
•
支持大部分的数据库
•
和
Maven/Gradle
无缝集成
•
和
Spring
无缝集成
•
非常类似的变更实现方式
•
复杂变更如果
SQL
不能满足的话,都可以用
Java
代码实现
较大区别是
Flyway
的变更以纯
SQL
为脚本,简单直接;
Liquibase
比较厚重,当然花样也比较多,包括:
•
可指定不同的
profile
•
具有通用的变更操作支持不同的数据库,如
createTable
•
Liquibase
开源版本支持
diff
模式,而此特性
Flyway
必须用商业版
•
Liquibase
开源版本支持回滚
rollback
,而此特性
Flyway
必须用商业版,
Liquibase
的付费版本据说对不同种类的回滚有更复杂的支持。
•
两者指定变更执行顺序的方法不同,
Flyway
通过固定的文件名格式来确定顺序,而
Liquibase
就是通过给定文件的顺序来执行,所以开发人员还要遵守好命名规则,例如按照日期
/
时间顺序命名
如果您想完全控制
SQL
,
Flyway
是首选工具,因为您可以使用完全定制的
SQL
甚至
Java
代码来更改数据库。多种数据源的情况下使用
Liquibase
会更加合适,不需要维护多种数据库脚本,和学习多种数据库语言,
Liquibase
对于大型项目更加友好。
综上所述,我们在项目中选择
Liquibae
。接下来简单来认识一下
Liquibase
。
Liquibase
介绍
Liquibase
是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。它的目标是提供一种数据库类型无关的解决方案,通过执行
schema
类型的文件来达到迁移。其优点主要有以下:
•
支持几乎所有主流的数据库,如
MySQL, PostgreSQL, Oracle, Sql Server, DB2
等;
•
支持多开发者的协作维护;
•
日志文件支持多种格式,如
XML, YAML, JSON, SQL
等;
•
支持多种运行方式,如命令行、
Spring
集成、
Maven
插件、
Gradle
插件等。
liquibase
官方文档地址:
www.liquibase.org/documentati
…
本地安装
根据自己的操作系统下载对应的二进制包,下载地址:
www.liquibase.org/dow...
我这里下载的是
Mac
版本的压缩包,然后在本地解压,解压包存放位置为:
sudo vi ~/.bash_profile
,修改环境变量配置文件:
export PATH="/Library/liquibase-4.4.3:$PATH"
|
然后
source ~/.bash_profile
,使配置文件生效。
最后执行下述命令,验证是否安装成功。
% liquibase --version
###################################################### _ _ _ _ #### | | (_) (_) | #### | | _ __ _ _ _ _| |__ __ _ ___ ___ #### | | | |/ _` | | | | | '_ \ / _` / __|/ _ \ #### | |___| | (_| | |_| | | |_) | (_| \__ \ __/ #### \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___| #### | | #### |_| #### ## ## Get documentation at docs.liquibase.com #### Get certified courses at learn.liquibase.com ## ## Free schema change activity reports at #### https://hub.liquibase.com #### ######################################################
Starting Liquibase at 10:06:20 (version 4.4.3 #53 built at 2021-08-05 18:32+0000)