Liquibase-数据库脚本版本管理控制 - 张铁牛
source link: https://www.cnblogs.com/ludangxin/p/16676701.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
Liquibase-数据库脚本版本管理控制 - 张铁牛 - 博客园
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依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>4.8.0</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies>
2.2 application.yaml
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
使用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
5.2 修改pom
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion>
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.3.9.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>org.example</groupId> <artifactId>liquibase-demo2</artifactId> <version>1.0-SNAPSHOT</version>
<properties> <liquibase.version>4.8.0</liquibase.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.liquibase</groupId> <artifactId>liquibase-core</artifactId> <version>${liquibase.version}</version> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency>
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> </dependencies> <build> <pluginManagement> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <version>${liquibase.version}</version> </plugin> </plugins> </pluginManagement> <plugins> <plugin> <groupId>org.liquibase</groupId> <artifactId>liquibase-maven-plugin</artifactId> <configuration> <!--properties文件路径,该文件记录了数据库连接信息等--> <propertyFile>src/main/resources/db/liquibase.properties</propertyFile> <propertyFileWillOverride>true</propertyFileWillOverride> </configuration> </plugin> </plugins> </build> </project>
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"/>
,然而这又引发了另外一个问题,plugin
和直接启动springboot项目生成的databasechangelog表中的filename字段值
不同,导致运行changelog
时报错,因为liquibase默认会比较同一filename
下的changeset
9. plugin-比较数据库差异
首先使用liquibase diff 功能前,我们在properties中加入参考的数据库 test3
配置信息
用于差异比较的数据库,以此数据库为准,生成diff xml
我们先观察下两个数据库有什么样的差异,再验证生成的diff xml
两个数据库如下,差异都用红色框起来了。
然后再用liquibase插件看下生成的 diff xml信息
双击liquibase plugin面板中的liquibase:diff
选项,如下图所示
执行完毕后,查看diff xml 内容如下:
生成的xml文件符合预期,将与test3数据库的差异都生成到了diff xml中
__EOF__
Recommend
-
24
Join GitHub today GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
-
24
Soldier's 5 Copyright © Soldier's 5 2020 ...
-
6
1 LiquiBase是什么 1.1 概述与特点 LiquiBase是用于跟踪、管理和应用数据库变更的开源工具,它把数据库的变更记录在文件(xml/sql等)中,然后把变更作用到数据库中,并记录。我觉得它的主要特点: (1)它支持多种数据...
-
5
1. Feign简介 1.1 简介 Feign是Netflix公司开发的一个声明式的REST调用客户端; Ribbon负载均衡、 Hystrⅸ服务熔断是我们Spring Cloud中进行微服务开发非常基础的组件,在使用的过程中我们也发现它们一般都是同时出现的,而且配置也都非常相似,每...
-
8
通过使用docker-compose 搭建一个主从数据库,本示例为了解耦 将两个server拆分到了两个compose文件中,当然也可以放到一个compose文件中 演示mysql版本:5.7.16 2. 部署流程 master节点:
-
2
Canal-监听数据库表的变化 - 张铁牛 - 博客园 Canal是阿里巴巴旗下的一款开源项目,纯Java开发。基于数据库增量日志解析,提供增量数据订阅&消费功能。...
-
5
SpringBoot数据库管理 - 用Liquibase对数据库管理和迁移? ...
-
3
优雅哥 SpringBoot 2.7 .2 实战基础 - 05 -使用 Liquibase 管理数据库版本 在企业开发中,数据库版本管理好像是一个伪命题,大多项目都是通过 Power Designer 之类的工具建模、...
-
2
...
-
5
Liquibase 和 Flyway 是两款成熟的、优秀的、开源/商业版的数据库版本管理工具,鉴于 Flyway 的社区版本对 Oracle 数据库支持存在限制,所以 boot-admin 选择整合 Liquibase 提供数据库版本管理能力支持。 Liquibase 开源版使用 Apache 2.0...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK