关系型数据库在一个中大型项目中,经常会出现因为新的需求导致项目初始的数据库表结构发生变化,从而产生一系列对数据库的变更或者是数据修正等数据库内容,而这些内容在经历了不同的项目成员以及时间的积累后就变的可读性、追溯性、维护性变得极差,造成无源可溯等局面;
另外一点在项目实际环境中,同一个项目通常分为本地开发环境、UAT环境、SIT环境、预生产环境以及生产环境,如果我们发生了对数据库表结构或者数据的变更的操作,数据库版本迁移无法跟随项目重启而同步数据库最新的变动,需要人工介入查找数据库迁移记录进行人工手动同步。
像管理项目工程使用Git一样将数据源也进行版本管理,形成一个可管理、可追溯、可维护、自动化以及可读性更高、一致性的数据源版本管理。目前主流的办法是使用liquibase以及flyway这两个开源技术实现上述目的。
作为于2006年推出的、可用于数据库迁移的开源类工具,Liquibase是基于变更日志(changelog)和变更集(changesets)文件的相关概念实现的。这些文件可以由SQL、XML、YAML、以及JSON编写而成。它们通过存储那些针对数据库结构的更改,以便将其应用到任何其他数据库的实例上。Liquibase提供了开源版本也提供了更多功能的收费版本。
Flyway是由Redgate公司带来的一款开源式的数据库迁移工具。该工具注重规则上的简约性,而非繁琐的配置。同样也提供了免费开源的版本和更多功能的收费版本。
Liquibase与Flyway都是在开源的基础上提供了付费版本以提供更加高级的功能。
提供了不同环境(windows、MacOS、Liunux)的命令行工具
都支持原生传统的SQL脚本进行数据库迁移
与Java融合性好,能够很轻易快速的集成进项目中
都支持Maven、Gradle插件进行数据库迁移
都支持常见的关系型数据以及云数据库,如MySQL、Oracle、H2、DB2、SQL Server、Postgres、MariaDB等等
Liquibase的官网地址
Liquibase的github地址
Liquibasezui最新版本更新内容
2022年5月27日发布的4.13版本,主要拆分 liquibase-core 和 liquibase-commercial jar 文件收费专业版的会受到影响,以及一些数据库驱动更新。
依赖Java环境,推荐Java11,Java8也可以如果是使用了liquibase安装程序默认包含了Java环境。
点我自动下载exe文件或者在Github上找到Windows安装包自行下载。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfuhIyBj-1659262067086)(D:\article\images\liquibase\download.png)]
下载说明:
包名 | 说明 |
---|---|
liquibase-.tar.gz | Linux |
liquibase-.zip | Linux |
liquibase-windows-x64-installer-.exe | Windows安装环境 |
liquibase-macos-installer-.dmg | MacOS安装包 |
liquibase-core-.jar | Base Liquibase库(开源 |
liquibase-commerical-.jar | 额外的商业功能 |
liquibase-additional-.zip | 其他库,例如liquibase-maven-plugin.jar和liquibase-cdi.jar、所有库的 Javadocs、所有文件的 ASC/MD5/SHA1 验证哈希 |
liquibase-core-.jar仅包含开源许可证。如果您使用Liquibase Pro或其他商业插件,您还必须安装liquibase-commercial-.jar. |
双击下载好的exe文件选择目录进行安装即可,同时配置勾选添加环境变量以便能够在控制台中使用。
检查,输入如下命令:
liquibase --version
出现liquibase的banner以及版本号、jre等信息即安装成功
$ 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 14:12:52 (version 4.14.0 #3667 built at 2022-07-22 18:36+0000)
Liquibase Home: D:\dev\database-command\liquibase
Java Home D:\dev\jdk1.8.0_20\jre (Version 1.8.0_20)
Libraries:
- internal\lib\commons-collections4.jar: Apache Commons Collections 4.4.0 By The Apache Software Foundation
- internal\lib\commons-lang3.jar: Apache Commons Lang 3.12.0 By The Apache Software Foundation
- internal\lib\commons-text.jar: Apache Commons Text 1.9.0 By The Apache Software Foundation
- internal\lib\connector-api.jar: J2EE Connector Architecture API Specification 1.5 By Sun Microsystems, Inc.
- internal\lib\h2.jar: H2 Database Engine 2.1.214 By H2 Group
- internal\lib\hsqldb.jar: HSQLDB 2.5.2 By The HSQL Development Group
- internal\lib\jaxb-api.jar: jaxb-api 2.3.1 By Oracle Corporation
- internal\lib\jaxb-core.jar: JAXB Core 4.0.0 By Eclipse Foundation
- internal\lib\jaxb-runtime.jar: JAXB Runtime 4.0.0 By Eclipse Foundation
- internal\lib\jaybird.jar: Jaybird 4.0.6.java8 (build: variant=jaybird tag=v4.0.6 date=202204271624) By Firebird project
- internal\lib\jcc.jar: IBM JCC JDBC 4 Driver 1.4.0 By IBM
- internal\lib\liquibase-commercial.jar: Commercial Liquibase Functionality 4.14.0 By Liquibase
- internal\lib\mariadb-java-client.jar: mariadb-java-client 3.0.6 By mariadb.com
- internal\lib\mssql-jdbc.jar: Microsoft JDBC Driver for SQL Server 10.2.1 By Microsoft Corporation
- internal\lib\ojdbc8.jar: JDBC 21.6.0.0.1 By Oracle Corporation
- internal\lib\opencsv.jar: opencsv 5.6.0
- internal\lib\picocli.jar: picocli 4.6.3 By Remko Popma
- internal\lib\postgresql.jar: PostgreSQL JDBC Driver 42.4.0 By PostgreSQL Global Development Group
- internal\lib\snakeyaml.jar: SnakeYAML 1.30.0
- internal\lib\snowflake-jdbc.jar: snowflake-jdbc 3.13.20
- internal\lib\sqlite-jdbc.jar: SQLite JDBC 3.36.0.3
Liquibase Version: 4.14.0
Liquibase Community 4.14.0 by Liquibase
从github下载Linux安装包并通过SFTP工具上传到Linux服务上。
Linux环境下载地址
创建一个liquibase文件用来存放liquibase解压的文件。
tar -zxvf liquibase-4.13.0.tar.gz
export PATH=$PATH:/home/devops/tools/liquibase
/home/devops/tools/liquibase 路径需要换成你自己的解压路径,直接在命令中执行上述命令,liquibase环境变量是临时,在关闭连接后,liquibase环境变量失效。在**/etc/profile**中添加liquibase环境变量
vi /etc/profile
输入i进入编辑模式,将上述配置添加到文件末尾,退出输入模式,保存即可。
添加完环境变量后,重新激活配置文件:
source /etc/profile
liquibase --version
官方CLI命令行工具包中包含了一个使用SQL、XML、XML以及JSON管理H2数据库的例子,可在安装包中的examples中找到。
liquibase init start-h2
上面H2管理窗口不能关闭,在打开一个新的终端,进入到examples\sql目录
执行例子中的数据变更操作,在H2数据库中进行新建表COMPANY以及PERSON表
liquibase update
执行过程中的是否连接 liquibaseHub 输入S跳过,执行结果如下:
刷新在浏览器中打开的H2数据库管理页面中可见多出4个表
表名 | 说明 |
---|---|
PERSION | 执行数据库变动添加的新的表 |
COMPANY | 执行数据库变动添加的新的表 |
DATABASECHANGELOG | Liquibase记录数据迁移记录日志表 |
DATABASECHANGELOGLOCK | Liquibase防止并发和相同服务执行同一变更的锁表(保证变更只有一个会执行) |
PERSON以及COMPANY建表语句可在 \examples\sql 中的 example-changelog.sql找到
如果想要使用XML、YAML或者JSON进行测试,进入相应的目录执行liquibase update即可(注意表重复创建问题)
推荐使用SQL格式的文件进行数据库变更,因为SQL更贴近项目,在项目中使用Liquibase的代价更小,同时不用另外维护一套XML、YAML、JSON格式的数据库变动文件,不用学习Liquibase使用XML管理数据库版本的标签语法。使用SQL文件,只需要加上SQL注解即可,一个简单标准的liquibase管理数据库的SQL文件如下:
--liquibase formatted sql
--changeset :
<SQL statements go here>
<SQL statements go here>
--rollback
--rollback
--changeset :
<SQL statements go here>
<SQL statements go here>
--rollback
--rollback
–liquibase formatted sql :liquibase识别SQL是否为liquibase标准的SQL文件,必写
–changeset author name>: 变更集:输入作者以及变更集的唯一编号(推荐使用时间戳+需求编号) 例如:root:1659256095-M0001-001
–rollback 回滚:如果执行的SQL需要回滚如何回滚,建议每个操作后面都加上回滚SQL
一个简单示例如下:
--liquibase formatted sql
--changeset zlc:20220102_CREATE_TABLE_USERTEST
CREATE TABLE `user_test` (
`id` int NOT NULL COMMENT '主键',
`username` varchar(128) DEFAULT NULL COMMENT '用户名',
`password` varchar(127) DEFAULT NULL COMMENT '密码',
`create_time` datetime DEFAULT NULL COMMENT '创建时间',
`update_time` datetime DEFAULT NULL COMMENT '更新时间',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户';
--rollback DROP TABLE user_test
至此,liquibase的入门级使用就完成了,后续会介绍如何使用Maven、Gradle插件以及融合进项目中使用,后续会将文章链接在此,敬请期待!
te_time datetime DEFAULT NULL COMMENT '更新时间', PRIMARY KEY (
id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT=‘用户’;
–rollback DROP TABLE user_test
至此,liquibase的入门级使用就完成了,后续会介绍如何使用Maven、Gradle插件以及融合进项目中使用,后续会将文章链接在此,敬请期待!