1. 简介
Liquibase是一个用于跟踪、管理和应用数据库变化的开源的数据库重构工具。它将所有数据库的变化(包括结构和数据)都保存在XML文件中,便于版本控制。
Liquibase使参与应用程序发布过程的任何人都可以轻松地:
- 不依赖于特定的数据库,Liquibase会自动适配目标数据库进行脚本初始化,目前支持至少30种主流数据库。
- 提供数据库比较功能,比较结果保存在XML中,基于该XML可以用Liquibase轻松部署或升级数据库。
- 以XML记录/存储数据库变化,其中以
author
和id
唯一标识一个变化(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 了解其作用。
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
的变化信息,比如 如下配置文件中创建了两个表role
和user
2.4 启动测试
项目启动完成后,查看数据库如下图,我们在 changelog-init-0.0.1.xml
文件中定义的脚本初始化到了数据库中
通过该demo快速的完成了springboot 集成 liquibase,且完成数据库的初始化。
2.5 测试changeset版本控制
前提是我们将
application.yml
中的drop-first
置为false
,因为drop-first=true
相当于每次都重置数据库
此时我们想在user表中新增一个 create_by
字段,便直接在之前的changeset中添加了字段,如下图所示,然后启动项目看结果
启动时控制台报错信息如下:
报错信息是我们直接修改了changeset后导致md5值与之前的不匹配(直接在之前的changeset中做了修改)
🤔 liquibase如何判断 是同一changeset的?
author
和 id
唯一标识一个变化(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配置信息
通过idea的maven功能,找到 liquibase plugin,双击如图 liquibase:generateChangeLog
选项,执行完成之后就会在 properties
文件中配置的 outputChangeLogFile
路径生成对应的xml文件,如下图所示
7. plugin-生成数据库修改文档
双击liquibase plugin面板中的 liquibase:dbDoc
选项,会生成数据库修改文档,默认会生成到 target
目录中,如下图所示
访问 index.html
会展示如下页面,简直应有尽有
8. plugin-发布changelog
之前我们对changelog的编辑都需要通过启动项目来运行changelog,有时候我们可能想不重启项目便能将修改发布运行到数据库中
双击liquibase plugin面板中的 liquibase:update
选项,便可以将修改同步到数据库中
注:这里有个bug(也可能不是bug,我目前还没找到对应的解决办法,如果您有解决方案 🙏):通过 plugin
发布 changelog
时,由于我们在 db.changelog-master
中 include
的是 classpath
路径,但是通过 plugin
发布时会报错找不到 include
的xml文件,此时我们可以通过设置相对路径来解决这个问题,比如 <include file="classpath:changelog/changelog-init-0.0.1.xml" relativetochangelogfile="true"></include>
,然而这又引发了另外一个问题, plugin
和直接启动springboot项目生成的 databasechangelog表中的filename字段值
不同,导致运行 changelog
时报错,因为liquibase默认会比较同一 filename
下的 changeset
9. plugin-比较数据库差异
首先使用liquibase diff 功能前,我们在properties中加入 参考的数据库 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插件看下生成的 diff xml信息
双击liquibase plugin面板中的 liquibase:diff
选项,如下图所示
执行完毕后,查看diff xml 内容如下:
生成的xml文件符合预期,将与test3数据库的差异都生成到了diff xml中
Original: https://www.cnblogs.com/ludangxin/p/16676701.html
Author: 张铁牛
Title: Liquibase-数据库脚本版本管理控制
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/802975/
转载文章受原作者版权保护。转载请注明原作者出处!