数据库迁移之liquibase-CLI

一、痛点与解决方案

痛点:

关系型数据库在一个中大型项目中,经常会出现因为新的需求导致项目初始的数据库表结构发生变化,从而产生一系列对数据库的变更或者是数据修正等数据库内容,而这些内容在经历了不同的项目成员以及时间的积累后就变的可读性、追溯性、维护性变得极差,造成无源可溯等局面;

另外一点在项目实际环境中,同一个项目通常分为本地开发环境、UAT环境、SIT环境、预生产环境以及生产环境,如果我们发生了对数据库表结构或者数据的变更的操作,数据库版本迁移无法跟随项目重启而同步数据库最新的变动,需要人工介入查找数据库迁移记录进行人工手动同步。

解决方案:

像管理项目工程使用Git一样将数据源也进行版本管理,形成一个可管理、可追溯、可维护、自动化以及可读性更高、一致性的数据源版本管理。目前主流的办法是使用liquibase以及flyway这两个开源技术实现上述目的。

二、Liquibase与Flyway异同

简介

Liquibase简介

作为于2006年推出的、可用于数据库迁移的开源类工具,Liquibase是基于变更日志(changelog)和变更集(changesets)文件的相关概念实现的。这些文件可以由SQL、XML、YAML、以及JSON编写而成。它们通过存储那些针对数据库结构的更改,以便将其应用到任何其他数据库的实例上。Liquibase提供了开源版本也提供了更多功能的收费版本。

liquibase工作原理图:
在这里插入图片描述

Flyway的介绍

Flyway是由Redgate公司带来的一款开源式的数据库迁移工具。该工具注重规则上的简约性,而非繁琐的配置。同样也提供了免费开源的版本和更多功能的收费版本。

相同点

  • Liquibase与Flyway都是在开源的基础上提供了付费版本以提供更加高级的功能。

  • 提供了不同环境(windows、MacOS、Liunux)的命令行工具

  • 都支持原生传统的SQL脚本进行数据库迁移

  • 与Java融合性好,能够很轻易快速的集成进项目中

  • 都支持Maven、Gradle插件进行数据库迁移

  • 都支持常见的关系型数据以及云数据库,如MySQL、Oracle、H2、DB2、SQL Server、Postgres、MariaDB等等

不同点

  • Flyway只支持使用SQL、Liquibase支持使用XML、SQL、YAML、JSON
  • Flyway的回滚功能为收费功能的,Liquibase提供开源的变更日志级别的回滚、但更加细粒度变更集的回滚也为收费功能。
  • Flyway会在对应的数据源中生成一个flyway_schema_history(默认)来记录数据库迁移记录;Liquibase会在对应的数据源中生成databasechangelog(数据库迁移日志)、databasechangeloglock(数据库迁移锁)两个表,LIquibase的数据库迁移表保证在相同时刻只有一个数据库变更日志在执行,解决多服务执行相同的数据库迁移脚本问题。

资料

2022年5月27日发布的4.13版本,主要拆分 liquibase-core 和 liquibase-commercial jar 文件收费专业版的会受到影响,以及一些数据库驱动更新。

三、命令行工具安装

要求

依赖Java环境,推荐Java11,Java8也可以如果是使用了liquibase安装程序默认包含了Java环境。

windows下安装Liquibase命令行工具

  • 下载Windows安装包

点我自动下载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

Linux下安装

  • 安装

从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

官方例子使用(H2)

官方CLI命令行工具包中包含了一个使用SQL、XML、XML以及JSON管理H2数据库的例子,可在安装包中的examples中找到。

  • 在Liquibase解压目录执行命令(或者在解压目录中找到examples目录中找到执行strat-h2.bat(Windows环境)、start-h2(Linux环境)脚本执行):
liquibase init start-h2

在这里插入图片描述

  • 执行成功后会在本地的8080端口开启H2数据库管理页面
    在这里插入图片描述

  • 使用原生传统的SQL脚本进行数据库迁移

上面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即可(注意表重复创建问题)

Liquibase的SQL文件格式说明

推荐使用SQL格式的文件进行数据库变更,因为SQL更贴近项目,在项目中使用Liquibase的代价更小,同时不用另外维护一套XML、YAML、JSON格式的数据库变动文件,不用学习Liquibase使用XML管理数据库版本的标签语法。使用SQL文件,只需要加上SQL注解即可,一个简单标准的liquibase管理数据库的SQL文件如下:

--liquibase formatted sql
--changeset <author name>:<a unique identifier for the SQL changeset>
<SQL statements go here>
<SQL statements go here>
--rollback <rollback SQL statements>
--rollback <rollback SQL statements>
--changeset <author name>:<another unique identifier>
<SQL statements go here>
<SQL statements go here>
--rollback <rollback SQL statements>
--rollback <rollback SQL statements>

–liquibase formatted sql :liquibase识别SQL是否为liquibase标准的SQL文件,必写
–changeset author name>:<a unique identifier for the SQL changeset 变更集:输入作者以及变更集的唯一编号(推荐使用时间戳+需求编号) 例如: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插件以及融合进项目中使用,后续会将文章链接在此,敬请期待!

猜你喜欢

转载自blog.csdn.net/chen15369337607/article/details/126088636