使用liquibase进行数据库迁移(Postgresql/Mysql)——springboot整合Liquibase以及使用maven命令执行Liquibase同步更新数据
文章目录
- 一。什么是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的优点
- 配置文件支持SQL、XML、JSON 或者 YAML
- 版本控制按序执行
- 可以用上下文控制sql在何时何地如何执行。
- 支持schmea的变更
- 根据配置文件自动生成sql语句用于预览
- 可重复执行迁移
- 可插件拓展
- 可回滚
- 可兼容14种主流数据库如oracle,mysql,pg等,支持平滑迁移
- 支持schema方式的多租户(multi-tenant)
2.liquibase的基本概念
changeSet
执行sql的并记录、版本控制的最小单元。即每条changeSet
生成1条执行记录,版本控制是基于执行记录的。changelog
即执行记录。由changeSet
执行后产生的记录。记录默认保存在databasechangelog
表中,此表由liquibase自动生成。包含id,author,filename,dateexcuted,orderexcuted,exectype,md5sum等字段。
其中md5sum字段是liquibase用来监测数据库表是否发生变化,当数据库数据发生变化时,该字段也会发生变化。所以Liquibase的工作流程简单来说就是先比对md5sum的值是否发生变化,如果发生变化便根据xml文件配置来更新数据库,否则不做任何操作。
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同步更新数据相关推荐
- 将数据导入到mysql_06955.10.2如何将CM的外部PostgreSQL数据库迁移至MySQL服务
作者:朱超杰 文档编写目的 在前面的文章<如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务>介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因 ...
- ef 数据迁移mysql_07116.3.0如何将CM的外部PostgreSQL数据库迁移至MySQL服务
文档编写目的 在前面的文章<6.3.0-如何将CM内嵌PostgreSQL服务迁移至外部PostgreSQL服务>介绍了将CM内嵌的PostgreSQL迁移至外部PostgreSQL,因为 ...
- Oracle数据库迁移postgreSQL
Oracle数据库迁移PostgreSQL 本文将记录一下Oracle数据库迁移至PostgreSQL数据库的整个过程,主要使用Navicat Premium 16以及pgAdmin 4来实现.参考: ...
- navicat premium相关应用(将oracle数据库迁移到mysql等)
navicat premium navicat premium连接到oracle数据库:http://blog.csdn.net/zjx86320/article/details/49464251: ...
- Oracle数据库迁移到MySQL
Oracle数据库迁移到MySQL 因为公司需要,需要将项目从Oracle数据库迁移到MySql找了很多方式,这里记较稳定的. 一.使用MySQL Migration Toolkit 1.安装 首先( ...
- Oracle数据库迁移到MySQL数据库
Oracle数据库迁移到MySQL数据库 1 字段类型差异 Oracle MySQL 解决方案 varchar2 varchar varchar date date/time/datetime/tim ...
- 从sqlite 迁移 mysql_将 Ghost 从 SQLite3 数据库迁移到 MySQL 数据库
下面我们就来说说如何从 SQLite 迁移到 MySQL . 准备 首先你要已经安装好 MySQL 数据库.如果你用的是 Ubuntu 系统,请参考这篇文章.其他系统请参考各自对应的文档. 导出当前数 ...
- mysql 修复数据表 批量_MySQL数据库迁移与MySQL数据库批量恢复
一.MySQL数据库迁移或备份 将相关数据库数据文件直接迁移方式 1. 了解使用InnoDB引擎创建数据库所产生的文件 使用MySQL InnoDB引擎所产生的文件(三个文件都很重要) .ibd:包含 ...
- 数据库迁移之mysql到达梦数据库
1 背景介绍 由于业务需求要求数据库国产化,因此将数据从mysql数据库中迁移到国产达梦数据库中.将mysql中的每个库迁移到达梦不同模式下,下面为详细过程. 2 具体步骤 (1)安装达梦客户端工具 ...
最新文章
- 谷歌发布开源Dopamine 2.0
- emv中的 部分匹配_【干货】EMV指标的精准运用
- TCP/IP入门(4) --应用层
- PHP学习记录第一篇:Ubuntu14.04下LAMP环境的搭建
- Java中return的两种用法
- Hadoop入门(五)IO操作
- Hanlp中自定义词典的配置、引用以及问题解决
- 十一、 C++特性之begin()与end()
- 微信小程序父子组件通信
- LeetCode-39. 组合总和 I
- iBooks 一样的翻书效果
- 《JavaScript权威指南第7版》第3章 类型、值和变量
- 理解Alpha-Beta 剪枝算法
- VMware vSphere 6 序列号大全
- virtualxposed使用教程_无需Root也能使用Xposed框架 —— VirtualXposed v0.14.5
- HTML5 SVG蝴蝶飞舞动画3D效果
- 基于VC++的WEB浏览器的实现
- 【记录】克服拖延症的方法 an exploratory study to overcome procrastination.
- disallow: /index.php?,那位高手知道robots文件的正确写法。我在网上看到两种说法。一种是 user-agent:* Disallow:/flims...
- vscode 实用插件