Flyway和Liquibase都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库模式的版本以及它是否与软件版本匹配。两种工具都集成在Maven或Gradle构建脚本中以及Spring Boot生态系统中,因此您可以完全自动化数据库重构。
Flyway使用SQL定义数据库更改,因此您可以定制SQL脚本,使其与基础数据库技术(例如Oracle或PostgreSQL)良好地配合使用。另一方面,使用Liquibase,您可以通过使用XML,YAML或JSON来定义数据库更改来引入抽象层。因此,Liquibase更适合在具有不同基础数据库技术的不同环境中安装的软件产品中使用。但是,如果您想完全控制SQL,Flyway是首选工具,因为您可以使用完全定制的SQL甚至Java代码来更改数据库。
多种数据源的情况下使用Liquibase会更加合适,不需要维护多种数据库脚本,和学习多种数据库语言,Liquibase对于大型项目更加友好。
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决方案,通过执行 schema 类型的文件来达到迁移。
官网:https://docs.liquibase.com/
1)Liquibase 特性
2)Liquibase 支持集成的方式有多种
无论哪种集成方式,都是通过编写存储变更的changelog文件来实现的,一般放在CLASSPATH
下,然后配置到执行路径中。目前 Liquibase 支持 XML、YAML、JSON 和 SQL 格式四种格式的 changelog 文件。
1)changelog文件格式如下:
当changelog文件越来越多时,可以使用
将文件管理起来,如:
的file属性表示要包含的changelog文件的路径,这个文件可以是LiquiBase支持的任意格式,relativeToChangelogFile如果为true,则表示file属性表示的文件路径是相对于根changelog而不是CLASSPATH的,默认为false。
指定的是changelog的目录2)changeSet,格式如下:
一个
标签对应一个变更集,由id、name、以及changelog的文件路径组成唯一标识。changelog在执行的时候并不是按照id的顺序,而是按照changeSet在changelog中出现的顺序。
LiquiBase在执行changelog时,会在数据库中插入两张表:DATABASECHANGELOG
和DATABASECHANGELOGLOCK
,分别记录changelog的执行日志和锁日志。
LiquiBase在执行changelog中的changeSet时,会首先查看DATABASECHANGELOG
表,如果已经执行过,则会跳过(除非changeSet的runAlways
属性为true,后面会介绍),如果没有执行过,则执行并记录changelog日志;
changelog中的一个changeSet对应一个事务,在changeSet执行完后commit,如果出现错误则rollback;
标签的主要属性有:
DATABASECHANGELOG
表中还记录了changeSet的MD5校验值MD5SUM,如果changeSet的id
和name
没变,而内容变了,则由于MD5值变了,即使runAlways的值为True,执行也是失败的,会报错。这种情况应该使用runOnChange
属性。
下有一个重要的子标签
,即定义回滚的SQL语句。对于create table
, rename column
和add column
等,LiquiBase会自动生成对应的rollback语句,而对于drop table
、insert data
等则需要显示定义rollback语句。
create table xxx(id int(11));
drop table xxx;
看下sql格式的文件:
--liquibase formatted sql
--changeset daniel:16040707
CREATE TABLE `role_authority_sum` (
`row_id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '自增id',
`role_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联role的role_id',
`authority_sum` int(11) unsigned NOT NULL DEFAULT '0' COMMENT 'perms的值的和',
`data_type_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '关联data_type的id',
PRIMARY KEY (`row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='角色的权限值的和,如角色有RD权限,则和为2+8=10';
xml格式文件:
3
title 3
content 3
1)diff命令:
java -jar liquibase.jar --driver=com.mysql.jdbc.Driver \
--classpath=./mysql-connector-java-5.1.29.jar \
--url=jdbc:mysql://127.0.0.1:3306/test \
--username=root --password=passwd \
diff \
--referenceUrl=jdbc:mysql://127.0.0.1:3306/authorization \
--referenceUsername=root --referencePassword=passwd
2)generateChangeLog
需要先下载liquibase, https://download.liquibase.org/
liquibase --driver=com.mysql.jdbc.Driver \
--classpath=./mysql-connector-java-5.1.29.jar \
--changeLogFile=liquibase/db.changelog.xml \
--url="jdbc:mysql://127.0.0.1:3306/test" \
--username=root \
--password=yourpass \
generateChangeLog
generateChangeLog命令默认只会创建数据库结构的变更日志文件(不支持以下功能:存储过程、函数以及触发器),如果希望创建插入数据的变更日志文件,可以使用参数diffTypes,该参数包括如下可选项:
例如生成数据:
liquibase --driver=com.mysql.jdbc.Driver \
--classpath=/Users/knowliu/Documents/mvn_repo/mysql/mysql-connector-java/5.1.44/mysql-connector-java-5.1.44.jar \
--changeLogFile=/data/db.changelog.xml \
--url="jdbc:mysql://127.0.0.1:3306/test" \
--username=root \
--password=123456 \
--diffTypes=data \
generateChangeLog
3)update:
CREATE TABLE `deparment` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
然后执行如下命令后,会创建deparment表:
liquibase update
Liquibase Community 3.8.2 by Datical
Liquibase: Update has been successful.
数据库变更也可以通过sql文件形式引用,避免myChangeLog.xml
文件过大,如下:
此外,还有回滚、创建tag等命令,见:https://juejin.cn/post/6844904013624934407
1)liquibase-maven-plugin的配置:
org.liquibase
liquibase-maven-plugin
3.4.2
src/main/resources/liquibase/test_changelog.xml
com.mysql.jdbc.Driver
jdbc:mysql://127.0.0.1:3306/test
root
passwd
process-resources
update
2)执行changelog中的变更:
$ mvn liquibase:update
3)执行rollback:
有三种形式的rollback,
#rollbackcount
$ mvn liquibase:rollback -Dliquibase.rollbackCount=3
#rollbackDate需要注意日期的格式,必须匹配当前平台上执行DateFormat.getDateInstance()得到的格式,比如我的格式为MMM d, yyyy,示例如:
$ mvn liquibase:rollback -Dliquibase.rollbackDate="Apr 10, 2016"
#rollbackTag使用tag标识,所以需要先打tag,示例如:
$ mvn liquibase:tag -Dliquibase.tag=tag20160410
$ mvn liquibase:rollback -Dliquibase.rollbackTag=tag20160410
1)pom.xml引入:
org.liquibase
liquibase-core
2)configuration:
@Configuration
public class LiquibaseConfig {
@Bean
public SpringLiquibase liquibase(DataSource dataSource) {
SpringLiquibase liquibase = new SpringLiquibase();
liquibase.setDataSource(dataSource);
//指定changelog的位置,这里使用的一个master文件引用其他文件的方式
liquibase.setChangeLog("classpath:liquibase/master.xml");
//liquibase.setContexts("development,test,production");
liquibase.setShouldRun(true);
return liquibase;
}
}
3)changelog文件:
init schema
启动系统,如果数据库中没有test表,则会自动创建,日志如下:
此外,我们还可以将sql语句include进来,进行数据的插入,例如init-data.sql:
--liquibase formatted sql
--changeset luyang:1
insert into test(name) values('young');
同样,要将这个文件include到master.xml中:
https://blog.csdn.net/a112626290/article/details/104199991
https://juejin.cn/post/6844903918099496968