Liquibase-数据库脚本版本管理控制

1. 简介

Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。

Liquibase使参与应用程序发布过程的任何人都可以轻松地:

  • 不依赖于特定的数据库,Liquibase会自动适配目标数据库进行脚本初始化,目前支持至少30种主流数据库。
  • 提供数据库比较功能,比较结果保存在XML中,基于该XML可以用Liquibase轻松部署或升级数据库。
  • 以XML记录/存储数据库变化,其中以 authorid唯一标识一个变化(ChangSet),支持数据库变化的合并,因此支持多开发人员同时工作。
  • 在数据库中保存数据库修改历史(DatabaseChangeHistory),在数据库升级时自动跳过已应用的变化(ChangSet)。
  • 提供变化应用的回滚功能,可按时间、数量或标签(tag)回滚已应用的变化。通过这种方式,开发人员可轻易的还原数据库在任何时间点的状态。
  • 可生成数据库修改文档(HTML格式)
  • 提供数据重构的独立的IDE和Eclipse插件
  • 将所有变化(包括结构和数据)存在XML文件中,便于版本控制的工具
    springboot支持,只需要导入依赖。
    application.yml配置(可选)
    不配置,默认去resource/db/changelog下找db.changelog-mastert.yml文件

2. Quick Start

使用步骤

  • step1: 创建一个数据库变更日志(change log)文件。
  • step2: 在变更日志文件内部创建一个变更集(change set)。
  • step3: 通过命令行或构建脚本对数据库进行变更集。
  • step4: 检验数据库中的变更

面向spring开发😉,通过springboot 整合 liquibase 了解其作用。

Liquibase-数据库脚本版本管理控制

2.1 添加maven依赖


    org.springframework.boot
    spring-boot-starter-parent
    2.3.9.RELEASE

        org.springframework.boot
        spring-boot-starter-web

        org.liquibase
        liquibase-core
        4.8.0

        org.springframework.boot
        spring-boot-starter-jdbc

        mysql
        mysql-connector-java

2.2 application.yaml

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
    username: root
    password: 123456
  liquibase:
    # 指定配置文件路径
    change-log: classpath:db/db.changelog-master.xml
    # 覆盖本地 ddl dml
    drop-first: true
    # 是否启用
    enabled: true
    # 记录版本日志表
    database-change-log-table: databasechangelog
    # 记录版本改变lock表
    database-change-log-lock-table: databasechangeloglock

2.3 添加 liquibase xml

db.changelog-master.xml

liquibase 配置文件入口,主要用来引用其他的 changelog.xml,如下配置文件中的 include,当然也可以使用 includeAll来引用整个目录


changelog-init-0.0.1.xml

主要记录了 ddl的变化信息,比如 如下配置文件中创建了两个表 roleuser


2.4 启动测试

项目启动完成后,查看数据库如下图,我们在 changelog-init-0.0.1.xml文件中定义的脚本初始化到了数据库中

Liquibase-数据库脚本版本管理控制

通过该demo快速的完成了springboot 集成 liquibase,且完成数据库的初始化。

2.5 测试changeset版本控制

前提是我们将 application.yml中的 drop-first置为 false,因为 drop-first=true相当于每次都重置数据库

此时我们想在user表中新增一个 create_by字段,便直接在之前的changeset中添加了字段,如下图所示,然后启动项目看结果

Liquibase-数据库脚本版本管理控制

启动时控制台报错信息如下:

报错信息是我们直接修改了changeset后导致md5值与之前的不匹配(直接在之前的changeset中做了修改)

Liquibase-数据库脚本版本管理控制

🤔 liquibase如何判断 是同一changeset的?

authorid唯一标识一个变化(ChangSet)

🤔 liquibase是如何进行changeset版本控制的?

Liquibase会对已经执行的 changelog的每一个 changeSet的内容进行 md5计算,生成的值是 databasechanglog表的 MD5SUM字段。

​ 当重新启动 Liquibase时,会对每个 changeSet进行 md5值计算,与 databasechanglog表中的 MD5SUM字段进行对比,如果不一致,说明 changeSet值已经被修改,无法启动成功。

3. DDL操作

3.1 创建表


3.2 删除表


3.3 修改表

3.3.1 添加字段


3.3.2 删除字段


3.3.3 修改字段


修改字段类型 不建议使用 因为会把字段的其他信息搞丢,比如字段注释


4. DML操作

4.1 数据初始化

项目部署难免会有系统内置的数据,这时我们可以通过使用liquibase进行初始化

新建csv文件 user-init-0.0.1.csv

"id","username","password","age","sex","role","create_time","create_by"
"111","张三","222","23","1","admin","2022-09-08 14:22:33","system"
"112","李四","333","26","1","admin","2022-09-08 14:22:33","system"
"113","王五","444","25","1","admin","2022-09-08 14:22:33","system"

使用 loadData标签进行数据的初始化


4.2 新增数据


4.3 初始化总是变动的数据

使用上述的 loadData标签加载数据,当数据发生变化时,直接修改csv文件进行发布时,会报错版本不一致。

这时可以使用 loadUpdateData标签进行处理,注意的是 changeset上需要加参数 runOnChange="true"(当数据发生改变时不去校验md5)如下


5. 集成maven

使用maven集成liquibase可以方便的通过liquibase maven plaugin实现很多功能。例如:脚本运行,生成文档,数据库差异比较等

5.1 添加 properties

添加properties 文件用来配置liquibase plugin的配置信息。例如 数据库的链接信息,配置文件路径的配置等

liquibase.properties

-- 数据库连接信息
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
username=root
password=123456
-- liquibse系统表 表名称配置
databaseChangeLogTableName=databasechangelog
databaseChangeLogLockTableName=databasechangeloglock
-- 输出文件路径配置
outputChangeLogFile=src/main/resources/db/changelog/changelog-output-0.0.1.xml
-- liuquibase xml文件路径指定
changeLogFile=src/main/resources/db/db.changelog-master.xml

5.2 修改pom


    4.0.0

        org.springframework.boot
        spring-boot-starter-parent
        2.3.9.RELEASE

    org.example
    liquibase-demo2
    1.0-SNAPSHOT

        4.8.0

            org.springframework.boot
            spring-boot-starter-web

            org.liquibase
            liquibase-core
            ${liquibase.version}

            org.springframework.boot
            spring-boot-starter-jdbc

            mysql
            mysql-connector-java

                    org.liquibase
                    liquibase-maven-plugin
                    ${liquibase.version}

                org.liquibase
                liquibase-maven-plugin

                 src/main/resources/db/liquibase.properties
                    true

6. plugin-逆向生成xml

通过liquibase maven 插件,从已有的数据库生成xml配置信息

Liquibase-数据库脚本版本管理控制

通过idea的maven功能,找到 liquibase plugin,双击如图 liquibase:generateChangeLog选项,执行完成之后就会在 properties文件中配置的 outputChangeLogFile路径生成对应的xml文件,如下图所示

Liquibase-数据库脚本版本管理控制

7. plugin-生成数据库修改文档

双击liquibase plugin面板中的 liquibase:dbDoc选项,会生成数据库修改文档,默认会生成到 target目录中,如下图所示

Liquibase-数据库脚本版本管理控制

访问 index.html会展示如下页面,简直应有尽有

Liquibase-数据库脚本版本管理控制

8. plugin-发布changelog

之前我们对changelog的编辑都需要通过启动项目来运行changelog,有时候我们可能想不重启项目便能将修改发布运行到数据库中

双击liquibase plugin面板中的 liquibase:update选项,便可以将修改同步到数据库中

注:这里有个bug(也可能不是bug,我目前还没找到对应的解决办法,如果您有解决方案 🙏):通过 plugin发布 changelog时,由于我们在 db.changelog-masterinclude的是 classpath路径,但是通过 plugin发布时会报错找不到 include的xml文件,此时我们可以通过设置相对路径来解决这个问题,比如 <include file="classpath:changelog/changelog-init-0.0.1.xml" relativetochangelogfile="true"></include>,然而这又引发了另外一个问题, plugin和直接启动springboot项目生成的 databasechangelog&#x8868;&#x4E2D;&#x7684;filename&#x5B57;&#x6BB5;&#x503C;不同,导致运行 changelog时报错,因为liquibase默认会比较同一 filename下的 changeset

9. plugin-比较数据库差异

首先使用liquibase diff 功能前,我们在properties中加入 &#x53C2;&#x8003;&#x7684;&#x6570;&#x636E;&#x5E93; test3配置信息

用于差异比较的数据库,以此数据库为准,生成diff xml

对比参考的数据库信息 (用于plugin-diff)
referenceUrl=jdbc:mysql://localhost:3306/test3?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true
referenceDriver=com.mysql.cj.jdbc.Driver
referenceUsername=root
referencePassword=123456
生成的差异比较xml的输出路径
diffChangeLogFile=src/main/resources/db/changelog/changelog-diff-0.0.1.xml

我们先观察下两个数据库有什么样的差异,再验证生成的diff xml

两个数据库如下,差异都用红色框起来了。

Liquibase-数据库脚本版本管理控制

然后再用liquibase插件看下生成的 diff xml信息

双击liquibase plugin面板中的 liquibase:diff选项,如下图所示

Liquibase-数据库脚本版本管理控制

执行完毕后,查看diff xml 内容如下:

生成的xml文件符合预期,将与test3数据库的差异都生成到了diff xml中

Liquibase-数据库脚本版本管理控制

Original: https://www.cnblogs.com/ludangxin/p/16676701.html
Author: 张铁牛
Title: Liquibase-数据库脚本版本管理控制

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/802975/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球