IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> liquibase介绍 -> 正文阅读

[大数据]liquibase介绍

1、Liquibase还是Flyway

Flyway和Liquibase都支持专业数据库重构和版本控制所需的所有功能,因此您将始终知道要处理的数据库模式的版本以及它是否与软件版本匹配。两种工具都集成在Maven或Gradle构建脚本中以及Spring Boot生态系统中,因此您可以完全自动化数据库重构。

Flyway使用SQL定义数据库更改,因此您可以定制SQL脚本,使其与基础数据库技术(例如Oracle或PostgreSQL)良好地配合使用。另一方面,使用Liquibase,您可以通过使用XML,YAML或JSON来定义数据库更改来引入抽象层。因此,Liquibase更适合在具有不同基础数据库技术的不同环境中安装的软件产品中使用。但是,如果您想完全控制SQL,Flyway是首选工具,因为您可以使用完全定制的SQL甚至Java代码来更改数据库。

多种数据源的情况下使用Liquibase会更加合适,不需要维护多种数据库脚本,和学习多种数据库语言,Liquibase对于大型项目更加友好。

2、什么是Liquibase

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在 changelog 文件中,便于版本控制,它的目标是提供一种数据库类型无关的解决方案,通过执行 schema 类型的文件来达到迁移。

官网:https://docs.liquibase.com/

1)Liquibase 特性

  • 支持几乎所有主流的数据库,如 MySQL, PostgreSQL, Oracle, Sql Server, DB2 等;
  • 支持多开发者的协作维护;
  • 日志文件支持多种格式,如 XML, YAML, JSON, SQL等;
  • 支持上下文相关逻辑
  • 生成数据库变更文档
  • 支持多种运行方式,如命令行、Spring 集成、Maven 插件、Gradle 插件等。

2)Liquibase 支持集成的方式有多种

  • Command 命令行模式
  • Maven
  • Ant
  • Spring Boot

3、Liquibase原理

无论哪种集成方式,都是通过编写存储变更的changelog文件来实现的,一般放在CLASSPATH下,然后配置到执行路径中。目前 Liquibase 支持 XML、YAML、JSON 和 SQL 格式四种格式的 changelog 文件。

1)changelog文件格式如下:

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">

    <changeSet id="20190713-04" author="solo">
        <createTable tableName="project_picture" remarks="项目图片表">
            <column name="id" type="varchar(64)" remarks="图片id">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="project_id" type="varchar(64)" remarks="项目id"/>
            <column name="picture_url" type="varchar(64)" remarks="图片地址"/>
            <column name="picture_url_32" type="varchar(64)" remarks="图片地址32位"/>
            <column name="picture_url_64" type="varchar(64)" remarks="图片地址64位"/>
        </createTable>
    </changeSet>
</databaseChangeLog>

当changelog文件越来越多时,可以使用<include>将文件管理起来,如:

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
    http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.1.xsd">
    <include file="logset-20160408/0001_authorization_init.sql" relativeToChangelogFile="true"/>
</databaseChangeLog>
  • <include>file属性表示要包含的changelog文件的路径,这个文件可以是LiquiBase支持的任意格式,relativeToChangelogFile如果为true,则表示file属性表示的文件路径是相对于根changelog而不是CLASSPATH的,默认为false。
  • <includeAll>指定的是changelog的目录

2)changeSet,格式如下:

一个<changeSet>标签对应一个变更集,由id、name、以及changelog的文件路径组成唯一标识。changelog在执行的时候并不是按照id的顺序,而是按照changeSet在changelog中出现的顺序。

LiquiBase在执行changelog时,会在数据库中插入两张表:DATABASECHANGELOGDATABASECHANGELOGLOCK,分别记录changelog的执行日志和锁日志。

LiquiBase在执行changelog中的changeSet时,会首先查看DATABASECHANGELOG表,如果已经执行过,则会跳过(除非changeSet的runAlways属性为true,后面会介绍),如果没有执行过,则执行并记录changelog日志;

changelog中的一个changeSet对应一个事务,在changeSet执行完后commit,如果出现错误则rollback;

<changeSet>标签的主要属性有:

  • runAlways:即使已经执行过,仍然每次都执行;注意: 由于DATABASECHANGELOG表中还记录了changeSet的MD5校验值MD5SUM,如果changeSet的idname没变,而内容变了,则由于MD5值变了,即使runAlways的值为True,执行也是失败的,会报错。这种情况应该使用runOnChange属性。
  • runOnChange:第一次的时候执行以及当changeSet的内容发生变化时执行。不受MD5校验值的约束。
  • runInTransaction:是否作为一个事务执行,默认为true。设置为false时需要小心:如果执行过程中出错了则不会rollback,数据库很可能处于不一致的状态;

<changeSet>下有一个重要的子标签<rollback>,即定义回滚的SQL语句。对于create table,?rename columnadd column等,LiquiBase会自动生成对应的rollback语句,而对于drop tableinsert data等则需要显示定义rollback语句。

<changeSet id="test-1" author="jiaotd">
    <sql>create table xxx(id int(11));</sql>
    <sqlFile path="xxx.sql"/>
    <rollback>
        <sql>drop table xxx;</sql>
        <sqlFile path="xxx-rollback.sql"/>
    </rollback>
</changeSet>

看下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格式文件:

<changeSet id="2" author="daniel" runOnChange="true">
    <insert tableName="contest_info">
        <column name="id">3</column>
        <column name="title">title 3</column>
        <column name="content">content 3</column>
    </insert>
</changeSet>

4、liquibase命令行:

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,该参数包括如下可选项:

  • tables [DEFAULT]表
  • columns [DEFAULT] 列
  • views [DEFAULT] 视图
  • primaryKeys [DEFAULT] 主键
  • indexes [DEFAULT] 索引
  • foreignKeys [DEFAULT]
  • sequences [DEFAULT]
  • data

例如生成数据:

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:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
  xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
         http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

    <changeSet id="1.0" author="bohan">
        <sql>
        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;
        </sql>
    </changeSet>
</databaseChangeLog>

然后执行如下命令后,会创建deparment表:

liquibase update
Liquibase Community 3.8.2 by Datical
Liquibase: Update has been successful.

数据库变更也可以通过sql文件形式引用,避免myChangeLog.xml文件过大,如下:

<changeSet id="1.1" author="bohan">
    <sqlFile path="./update_deparment_name.sql"></sqlFile>
</changeSet>
此外,还有回滚、创建tag等命令,见:https://juejin.cn/post/6844904013624934407

5、maven集成liquibase:

1)liquibase-maven-plugin的配置:

<plugin>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-maven-plugin</artifactId>
  <version>3.4.2</version>
  <configuration>
      <changeLogFile>src/main/resources/liquibase/test_changelog.xml</changeLogFile>
      <driver>com.mysql.jdbc.Driver</driver>
      <url>jdbc:mysql://127.0.0.1:3306/test</url>
      <username>root</username>
      <password>passwd</password>
  </configuration>
  <executions>
      <execution>
          <phase>process-resources</phase>
          <goals>
              <goal>update</goal>
          </goals>
      </execution>
  </executions>
</plugin>

2)执行changelog中的变更:

$ mvn liquibase:update

3)执行rollback:

有三种形式的rollback,

  • - rollbackCount: 表示rollback的changeset的个数;
  • - rollbackDate:表示rollback到指定的日期;
  • - rollbackTag:表示rollback到指定的tag,需要使用LiquiBase在具体的时间点打上tag;
    ?
#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

https://zzkenyon.github.io/2020/12/01/%E6%95%B0%E6%8D%AE%E5%BA%93%E6%8A%80%E6%9C%AF-liquibase%E4%BD%BF%E7%94%A8%E5%92%8C%E5%8E%9F%E7%90%86%20/

6、springboot集成liquibase:

1)pom.xml引入:

<dependency>
  <groupId>org.liquibase</groupId>
  <artifactId>liquibase-core</artifactId>
</dependency>

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文件:

<?xml version="1.0" encoding="utf-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd">

    <property name="now" value="now()" dbms="h2"/>
    <property name="now" value="now()" dbms="mysql"/>

    <property name="floatType" value="float4" dbms="postgresql, h2"/>
    <property name="floatType" value="float" dbms="mysql, oracle, mssql, mariadb"/>

	<include file="liquibase/initial_schema.xml" relativeToChangelogFile="false"/>
</databaseChangeLog>
<databaseChangeLog
        xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd">
    <property name="autoIncrement" value="true" dbms="mysql"/>
    <changeSet id="init-schema" author="Young" >
        <comment>init schema</comment>
        <createTable tableName="test">
            <column name="id" type="int" autoIncrement="${autoIncrement}">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(100)">
            </column>
        </createTable>

        <modifySql dbms="mysql">
            <append value="ENGINE=INNODB DEFAULT CHARSET=utf8"/>
        </modifySql>
    </changeSet>
</databaseChangeLog>

启动系统,如果数据库中没有test表,则会自动创建,日志如下:

此外,我们还可以将sql语句include进来,进行数据的插入,例如init-data.sql:

--liquibase formatted sql
--changeset luyang:1
insert into test(name) values('young');

同样,要将这个文件include到master.xml中:

<include file="classpath:liquibase/init-data.sql"/>

https://blog.csdn.net/a112626290/article/details/104199991

https://juejin.cn/post/6844903918099496968

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-12-01 17:46:35  更:2021-12-01 17:49:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 9:02:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码