文章目录

  • 一。什么是Liquibase?
    • 1.liquibase的优点
    • 2.liquibase的基本概念
    • 3.官网地址
  • 二。SpringBoot整合Liquibase
    • 1.简介
    • 2.项目结构
    • 3.测试结果
    • 4.特别注意
    • 5.扩展
    • 6.项目地址
  • 三。使用Maven命令来执行Liquibase同步更新数据
    • 1.简介
    • 2.项目结构
    • 3.测试结果
    • 4.项目地址:

一。什么是Liquibase?

liquibase是一个数据库变更的版本控制工具。项目中通过liquibase解析用户编写的liquibase的配置文件,生成sql语句,并执行和记录。执行是根据记录确定sql语句是否曾经执行过,和配置文件里的预判断语句确定sql是否执行。
liquibase开源版使用Apache 2.0协议。

1.liquibase的优点

  1. 配置文件支持SQL、XML、JSON 或者 YAML
  2. 版本控制按序执行
  3. 可以用上下文控制sql在何时何地如何执行。
  4. 支持schmea的变更
  5. 根据配置文件自动生成sql语句用于预览
  6. 可重复执行迁移
  7. 可插件拓展
  8. 可回滚
  9. 可兼容14种主流数据库如oracle,mysql,pg等,支持平滑迁移
  10. 支持schema方式的多租户(multi-tenant)

2.liquibase的基本概念

  1. changeSet执行sql的并记录、版本控制的最小单元。即每条changeSet生成1条执行记录,版本控制是基于执行记录的。
  2. changelog 即执行记录。由changeSet执行后产生的记录。记录默认保存在databasechangelog表中,此表由liquibase自动生成。包含id,author,filename,dateexcuted,orderexcuted,exectype,md5sum等字段。

其中md5sum字段是liquibase用来监测数据库表是否发生变化,当数据库数据发生变化时,该字段也会发生变化。所以Liquibase的工作流程简单来说就是先比对md5sum的值是否发生变化,如果发生变化便根据xml文件配置来更新数据库,否则不做任何操作。

  1. databasechangeloglock。liquibase的锁表。liquibase在执行前更新此表的locked为true,执行完liquibase的工作,将locked更新为false,适合集群使用。

3.官网地址

https://www.liquibase.org/

二。SpringBoot整合Liquibase

1.简介

此Demo为SpringBoot整合Liquibase示例,集成了Postgresql和Mysql数据库

2.项目结构

pom.xml文件如下所示:

<?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 https://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.6.7</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>liquibase-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>liquibase-demo</name><description>Demo project for Spring Boot</description><properties><java.version>11</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!--postgresql数据库依赖--><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version></dependency><!--liquibase依赖--><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>4.4.1</version></dependency><!--mysql依赖--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yml文件配置如下:

server:port: 8080
spring:application:name: liquibase-demodatasource:url: jdbc:postgresql://localhost:5432/testusername: postgrespassword: postgresdriver-class-name: org.postgresql.Driver#    url: jdbc:mysql://localhost:3306/liquibase?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
#    username: root
#    password: root
#    driver-class-name: com.mysql.cj.jdbc.Driverliquibase:enabled: truechange-log: "classpath:/db/changelog/dbchangelog.xml"

dbchangelog.xml内容如下:(dbchangelog.xml为Liquibase的入口)

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.4.xsd"><!--  relativeToChangelogFile设置为true时,文件路径为相对dbchangelog.xml的路径  --><include relativeToChangelogFile="true" file="/data/create-table.xml" ></include><include relativeToChangelogFile="true" file="/data/configuration-data.xml" ></include></databaseChangeLog>

使用create-table.xml创建相应的table对象,内容如下:

<?xml version="1.0" encoding="UTF-8"?><databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.4.xsd"><changeSet  id="create-student-table"  author="Keson"><comment>create-student-table</comment><createTable  tableName="student"><column  name="id"  type="int"><constraints  primaryKey="true"  nullable="false"/></column><column  name="student_no"  type="varchar(50)"><constraints  nullable="false"/></column><column  name="name"  type="varchar(50)"><constraints  nullable="false"/></column><column  name="sex"  type="varchar(5)"><constraints  nullable="false"/></column><column  name="active"  type="boolean"defaultValueBoolean="true"/></createTable></changeSet></databaseChangeLog>

使用configuration-data.xml配置table属性:

<?xml version="1.0" encoding="UTF-8"?><databaseChangeLogxmlns="http://www.liquibase.org/xml/ns/dbchangelog"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangeloghttp://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.4.xsd"><changeSet id="student-info-data" author="keson" runOnChange="true"><comment>reload data in student</comment><delete tableName="student"></delete><loadUpdateData encoding="UTF-8"file="student.csv"relativeToChangelogFile="true"commentLineStartsWith="//"tableName="student"usePreparedStatements="true"primaryKey="id"><column name="id" type="NUMERIC"/><column name="student_no" type="STRING"/><column name="name" type="STRING"/><column name="sex" type="STRING"/><column name="active" type="BOOLEAN"/></loadUpdateData></changeSet></databaseChangeLog>

使用student.csv存储table数据:

id,student_no,name,sex,active
//student data
1,001,张三,男,true
2,002,李四,男,true
3,003,王五,男,true
4,004,杰西卡,女,true
5,005,米歇尔,女,true

启动类LiquibaseDemoApplication代码如下:

package com.example.liquibasedemo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class LiquibaseDemoApplication {public static void main(String[] args) {SpringApplication.run(LiquibaseDemoApplication.class, args);}}

3.测试结果

启动成功后,Liquibase数据库新生成了三张表,databasechangelog,databasechangeloglock,student。其中databasechangelog和databasechangeloglock是Liquibase帮我们自动生成的,student是我们自己配置xml文件后生成的:

更新student.csv文件,再次启动,发现数据库也出现相应改变:


数据发生变化之后可以发现databasechangelog表中的md5sum的值也发生了变化:

4.特别注意

当runOnChange设置为true时:第一次的时候执行以及当changeSet的内容发生变化时执行。不受MD5校验值的约束。

如果不设置的话,更新数据库操作会校验MD5的值,如果值不同则会报错,提示两次的md5sum值不同,不能使用Liquibase同步更新数据:

5.扩展

当然除了使用XML文件的形式,你还可以使用YAML,SQL,JSON等文件达到相同的效果,具体实现请参考以下网址:
https://docs.liquibase.com/tools-integrations/springboot/using-springboot-with-maven.html

6.项目地址

https://gitee.com/hair_gel_king/liquibase-demo

三。使用Maven命令来执行Liquibase同步更新数据

1.简介

此Demo为maven项目整合Liquibase示例,集成了Postgresql和Mysql数据库,无启动类,使用mvn liquibase:update命令执行Liquibase同步更新数据

2.项目结构


相较于SpringBoot整合Liquibase,不同的文件是增加了一个liquibase.properties配置文件以及pom.xml文件中引入了maven命令插件。

liquibase.properties主要是配置changelog.xml的位置信息以及数据库的连接信息,其内容如下:

changelogFile=db/rule/dbchangelog.xmldriver=org.postgresql.Driver
url=jdbc:postgresql://localhost:5432/test
username=postgres
password=postgres#driver=com.mysql.cj.jdbc.Driver
#url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC
#username: root
#password: rootverbose=true

pom.xml文件内容如下:

<?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><groupId>org.example</groupId><artifactId>liquibase-demo-mvn</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target><demo.propertyFile>liquibase.properties</demo.propertyFile></properties><build><plugins><plugin><groupId>org.liquibase</groupId><artifactId>liquibase-maven-plugin</artifactId><version>4.4.1</version><configuration><propertyFileWillOverride>true</propertyFileWillOverride><propertyFile>${demo.propertyFile}</propertyFile></configuration><executions><execution><phase>process-resources</phase><goals><goal>update</goal></goals></execution></executions><dependencies><dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.2.18</version></dependency></dependencies></plugin></plugins></build><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>6.0.6</version></dependency></dependencies>
</project>

其他文件没有改动,此处省略。

3.测试结果

在项目根目录进入CMD,并使用mvn liquibase:update -Drule.engine.configuration.propertyFile命令启动,后面跟的是liquibase.properties所在的路径信息,如下面我的启动命令:

mvn liquibase:update -Drule.engine.configuration.propertyFile=E:\project\demo\liquibasedemo\liquibase-demo-mvn\liquibase.properties


执行成功后能看见build success:

之后数据库就能出现相关table和数据了:

更新student.csv文件,再次执行,发现数据库也出现相应改变:

4.项目地址:

https://gitee.com/hair_gel_king/liquibase-demo-mvn

使用liquibase进行数据库迁移(Postgresql/Mysql)——springboot整合Liquibase以及使用maven命令执行Liquibase同步更新数据相关推荐

  1. 将数据导入到mysql_06955.10.2如何将CM的外部PostgreSQL数据库迁移至MySQL服务

    作者:朱超杰 文档编写目的 在前面的文章<如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务>介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因 ...

  2. ef 数据迁移mysql_07116.3.0如何将CM的外部PostgreSQL数据库迁移至MySQL服务

    文档编写目的 在前面的文章<6.3.0-如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务>介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因为 ...

  3. Oracle数据库迁移postgreSQL

    Oracle数据库迁移PostgreSQL 本文将记录一下Oracle数据库迁移至PostgreSQL数据库的整个过程,主要使用Navicat Premium 16以及pgAdmin 4来实现.参考: ...

  4. navicat premium相关应用(将oracle数据库迁移到mysql等)

    navicat premium navicat premium连接到oracle数据库:http://blog.csdn.net/zjx86320/article/details/49464251: ...

  5. Oracle数据库迁移到MySQL

    Oracle数据库迁移到MySQL 因为公司需要,需要将项目从Oracle数据库迁移到MySql找了很多方式,这里记较稳定的. 一.使用MySQL Migration Toolkit 1.安装 首先( ...

  6. Oracle数据库迁移到MySQL数据库

    Oracle数据库迁移到MySQL数据库 1 字段类型差异 Oracle MySQL 解决方案 varchar2 varchar varchar date date/time/datetime/tim ...

  7. 从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库

    下面我们就来说说如何从 SQLite 迁移到 MySQL . 准备 首先你要已经安装好 MySQL 数据库.如果你用的是 Ubuntu 系统,请参考这篇文章.其他系统请参考各自对应的文档. 导出当前数 ...

  8. mysql 修复数据表 批量_MySQL数据库迁移与MySQL数据库批量恢复

    一.MySQL数据库迁移或备份 将相关数据库数据文件直接迁移方式 1. 了解使用InnoDB引擎创建数据库所产生的文件 使用MySQL InnoDB引擎所产生的文件(三个文件都很重要) .ibd:包含 ...

  9. 数据库迁移之mysql到达梦数据库

    1 背景介绍 由于业务需求要求数据库国产化,因此将数据从mysql数据库中迁移到国产达梦数据库中.将mysql中的每个库迁移到达梦不同模式下,下面为详细过程. 2 具体步骤 (1)安装达梦客户端工具 ...

最新文章

  1. 谷歌发布开源Dopamine 2.0
  2. emv中的 部分匹配_【干货】EMV指标的精准运用
  3. TCP/IP入门(4) --应用层
  4. PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建
  5. Java中return的两种用法
  6. Hadoop入门(五)IO操作
  7. Hanlp中自定义词典的配置、引用以及问题解决
  8. 十一、 C++特性之begin()与end()
  9. 微信小程序父子组件通信
  10. LeetCode-39. 组合总和 I
  11. iBooks 一样的翻书效果
  12. 《JavaScript权威指南第7版》第3章 类型、值和变量
  13. 理解Alpha-Beta 剪枝算法
  14. VMware vSphere 6 序列号大全
  15. virtualxposed使用教程_无需Root也能使用Xposed框架 —— VirtualXposed v0.14.5
  16. HTML5 SVG蝴蝶飞舞动画3D效果
  17. 基于VC++的WEB浏览器的实现
  18. 【记录】克服拖延症的方法 an exploratory study to overcome procrastination.
  19. disallow: /index.php?,那位高手知道robots文件的正确写法。我在网上看到两种说法。一种是 user-agent:* Disallow:/flims...
  20. vscode 实用插件

热门文章

  1. 外贸老鸟如何使用领英的技巧方法
  2. js基础之倒计时代码
  3. UnicodeDecodeError: 'gbk' codec can't decode byte 0x80
  4. companynameparser中文公司名称分词工具
  5. 蓝桥杯官方板子问题(深夜学习——单片机)
  6. php教案 职校,职校主题班会教案
  7. 量化投资接口的Public API文档
  8. ESP32修改BootLoader:在boot中添加GPIO和IIC驱动方式
  9. 在BIOS中设置电脑开机密码
  10. Zynq动态更新FPGA比特流