SpringBoot整合Liquibase提升数据库变更的可控性、安全性、自动化程度(最详细)

为什么要使用liquibase?

- 团队协作与版本管理

 - 当多人(或多个小组)并行开发、对同一数据库结构进行变更时,如果仅靠手写 SQL 脚本,很 容易产生冲突或漏掉某些变更。

 - Liquibase 将所有 DDL/DML 操作以“changeset”形式纳入源码管理(Git、SVN),保证每条变更都有明确记录、能回溯,比单纯的 SQL 文件更具可控性。

- 环境一致性与自动化部署

 - 在开发、测试、预生产、生产等多套环境中,手动执行脚本不仅繁琐,还容易漏执行或顺序错乱。

 - Liquibase 可在应用启动或 CI/CD 流水线中自动检测并执行“待跑”变更集,确保各环境数据库始终与代码版本保持一致。

- 回滚与容灾能力

 - 手动脚本一旦执行错误,回滚往往要手写“撤销脚本”,既费时又容易出错。

  - 在 Liquibase 中,每个 changeset 都可以定义 rollback 逻辑,部署失败时能够精准回退到前一个健康状态。

- 防止数据库“漂移”

 - 长期演进过程中,数据库实际结构可能与预期文档或代码不同步,导致线上问题排查困难。

 - Liquibase 通过维护 DATABASECHANGELOG 表,自动对比历史记录与变更脚本,及时发现并修复结构漂移。

- 合规审计需求

 - 某些行业(金融、医疗、政府)对数据库变更有严格审计和备案要求,需要完整的操作记录和执行人信息。

 - Liquibase 的 DATABASECHANGELOG 表会记录每条变更的执行时间、执行人和执行状态,天然满足审计需求。

等等....这里我们先介绍springboot整合liquibase的配置,数据库版本控制和自动执行和回滚

springboot整合liquibase

- 将所有建表、修改表结构、插入初始数据等操作都以“changeset”(变更集)的形式记录在 XML、YAML、JSON 或 SQL 文件中,存储在项目源码里,类似于 Git 管理代码的方式。

 - 每次启动应用时,Liquibase 会自动对比当前数据库已执行的变更集与源码中的变更集,确保数据库结构与代码版本一致。

- 在 Spring Boot 启动阶段,Liquibase 自动扫描并执行未应用的变更集,无需手动在数据库端运行脚本。支持为每条变更集定义回滚(rollback)逻辑,遇到部署错误或回滚需求时,可以精准撤销指定版本的数据库变更。

- Liquibase 提供 diffdiffChangeLog 命令,可比对两个数据库之间的结构差异,自动生成变更集脚本,便于团队协作和历史回顾。还能导出数据库的当前快照或变更历史,生成 HTML、JSON 等格式的数据库文档

- Liquibase 在数据库中维护一个 DATABASECHANGELOG 表,记录每个变更集的执行时间、执行人等信息,方便事后审计和问题定位。

- 支持 Oracle、MySQL、PostgreSQL、SQL Server、DB2、H2、SQLite 等主流关系型数据库,跨数据库平台保持统一的变更管理方式。

1、导入liquibase所需的依赖并引入Liquibase的插件:
<!-- Liquibase 核心引擎 --><dependency><groupId>org.liquibase</groupId><artifactId>liquibase-core</artifactId><version>4.33.0</version></dependency><!--Liquibase所需的依赖--><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.13.0</version></dependency>
             <plugin><groupId>org.liquibase</groupId><artifactId>liquibase-maven-plugin</artifactId><version>4.33.0</version><configuration><!-- 指定 changelog 主入口文件,用于 update 等命令 -->
<changeLogFile>src/main/resources/liquibase/changelog/master.xml</changeLogFile><!-- 指定 generateChangeLog 的输出文件 -->
<outputChangeLogFile>src/main/resources/liquibase/changelog/generated/init-schema.xml</outputChangeLogFile><!-- 添加数据库连接信息 --><url>jdbc:mysql://yourhost:3306/yourDbSchema?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true&amp;useSSL=false&amp;serverTimezone=Asia/Shanghai</url><username>yoursqlname</username><password>yoursqlpassword</password><driver>com.mysql.cj.jdbc.Driver</driver></configuration><executions><execution><phase>process-resources</phase><goals><goal>generateChangeLog</goal></goals></execution></executions><!-- 添加依赖 --><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies></plugin>

注意插件的版本要和依赖的一致

 2、yml文件配置基本信息:
spring:liquibase:change-log: classpath:liquibase/changelog/master.xml  # 指定XML路径enabled: true # true-当 Spring Boot 启动时,自动启用 Liquibase,并执行你在 changelog.xml 中定义的数据库变更  false-禁用 Liquibase,不会自动执行任何 changelog 逻辑
3、按照插件的<changeLogFile>标签和<outputChanegLogFile>标签构建文件架构:

4、在master.xml文件上配置信息:
<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-3.1.xsd"><include file="generated/init-schema.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
5、调用liquibase插件执行 liquibase:generateChangeLog根据数据库生成init-schema.xml:

执行成功后就会生成该文件并生成sql对应的xml代码:

 我们可以将它交给git管理,团队成员在拉取我们git分支时就可以通过运行项目自动读取xml文件同步我们的数据库

6、日常应用:

假设开发人员需要在数据库表contracts上新增一个字段status,直接在init-schema.xml上进行维护。

使用<changeSet>标签添加在表的<changeSet>下面:

<changeSet author="Layux" id="202507251618"><addColumn tableName="contracts"><column name="status" remarks="状态" type="TINYINT"><constraints nullable="false"/></column></addColumn></changeSet>

id可以使用时间的形式,方便后期维护

然后执行mvn liquibase:update,这样在datebasechangelog表上就会记录这次的操作

同时 数据库表contracts上也会新增这个status字段

7、回滚(回滚后datebasechangelog表的记录数据会消失,操作表中的变更会退回)
rollbackCount(按数量回滚):

命令:

mvn liquibase:rollback -Dliquibase.rollbackCount=1

建议补充rollback块:

<changeSet author="Layux" id="202507251618"><addColumn tableName="contracts"><column name="status" remarks="状态" type="TINYINT"><constraints nullable="false"/></column></addColumn><rollback><dropColumn tableName="contracts" columnName="status"/></rollback>
</changeSet>
rollbackTag(按标签):
<changeSet id="1753429943969-1" author="32452">...<tagDatabase tag="before_status_added"/>
</changeSet>

建议添加 <rollback>

命令:

mvn liquibase:rollback -Dliquibase.rollbackTag=before_status_added
rollbackToDate(按时间)

命令:

mvn liquibase:rollback -Dliquibase.rollbackDate=2025-07-25T16:20:00

该时间点应早于 status 字段添加时间

 建议添加 <rollback>

生成 SQL 回滚语句(手动执行)

命令:

mvn liquibase:rollbackSQL -Dliquibase.rollbackCount=1

建议添加 <rollback>

8、变更,sql表分文件(可选)

在大型项目中,为例方便维护,常常一表一文件
1、我们可以使用在入口的master.xml文件统一引入:

eg:

<databaseChangeLog ...><include file="tables/user.xml" relativeToChangelogFile="true"/><include file="tables/dept.xml" relativeToChangelogFile="true"/><include file="tables/contract.xml" relativeToChangelogFile="true"/>
</databaseChangeLog>
 2、使用Python脚本自动拆分:
  • 读取 init-schema.xml

  • 每当遇到一个 <changeSet>,分析其中的表名(如 <createTable tableName="users">

  • 将每个 <changeSet> 写入独立的 users.xmlcontracts.xml 等文件

  • 自动生成 changelog-master.xml 并用 <include> 引入

 分文件维护:在变更表的过程中,我们常常将每个变更都分xml文件存储,表名可以用日期或者变更备注

eg:

src/main/resources/liquibase/
├── changelog/
│   ├── master.xml                  # 主 changelog 文件
│   ├── 2024/
│   │   ├── 20240701-add-user-table.xml
│   │   ├── 20240710-add-status-column.xml
│   │   └── ...
│   └── 2025/
│       ├── 20250725-update-contracts-status.xml
│       └── ...


1、配置主changelog文件(master.xml)
<?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-3.8.xsd"><!-- 引用子文件 --><include file="liquibase/changelog/2024/20240701-add-user-table.xml"/><include file="liquibase/changelog/2024/20240710-add-status-column.xml"/><include file="liquibase/changelog/2025/20250725-update-contracts-status.xml"/></databaseChangeLog>
2、新建子 changelog 文件(每个文件一个 changeSet)
<?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-3.8.xsd"><changeSet id="20250725-1" author="layux"><preConditions onFail="MARK_RAN"><not><columnExists tableName="contracts" columnName="status"/></not></preConditions><addColumn tableName="contracts"><column name="status" type="TINYINT" defaultValueNumeric="0" remarks="状态"/></addColumn></changeSet></databaseChangeLog>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/92955.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/92955.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据写入因为汉字引发的异常

spark 数据写hive表,发生 查询分区异常问题 异常: 25107124 19 26.49 ERROR Hive: MelaException(message.Exception thrown when execuling quey. S ELECT DISTINCT ‘org apache.hadop.hive melastore .modelMpartion As"NUCLEUS TYPE,AONCREATE TIME,AO.LAST ACCE…

Springboot项目实现将文件上传到阿里云

Springboot项目实现将文件上传到阿里云 一、概述二、具体步骤 2.1引入阿里云工具 首先先建utils包&#xff0c;然后引入AliOSSUtils类&#xff0c;如下&#xff1a; package com.hechixueyuan.forestfiredetectionsystem.utils;import com.aliyun.oss.OSS; import com.aliyun.o…

如何理解 TCP 是字节流协议?详解

文章目录一、面向字节流二、粘包问题应用层如何解决粘包问题&#xff1f;一、面向字节流 使用 TCP socket 进行网络编程&#xff0c;Linux 内核会给每个 socket 都分配一个发送缓冲区和一个接收缓冲区 由于缓冲区的存在, TCP 读写不需要一一匹配&#xff0c;例如&#xff1a;…

面试问题总结——关于OpenCV(二)

最近小组在面试视觉算法工程师,顺便整理了一波关于OpenCV的面试题目。 有些知识点也不深入,对于写的不对的地方,欢迎指正。 目录 20.像素梯度如何计算? 21.关于开运算和闭运算的理解 22.开运算和闭运算有什么优缺点? 23.图像插值有哪些? 24.图像金字塔的原理 25.边缘检测…

目标导向的强化学习:问题定义与 HER 算法详解—强化学习(19)

目录 1、目标导向的强化学习&#xff1a;问题定义 1.1、 核心要素与符号定义 1.2、 核心问题&#xff1a;稀疏奖励困境 1.3、 学习目标 2、HER&#xff08;Hindsight Experience Replay&#xff09;算法 2.1、 HER 的核心逻辑 2.2、 算法步骤&#xff08;结合 DDPG 举例…

2025 XYD Summer Camp 7.21 智灵班分班考 · Day1

智灵班分班考 Day1 时间线 8:00 在滨兰实验的远古机房中的一个键盘手感爆炸的电脑上开考。开 T1&#xff0c;推了推发现可以 segment tree 优化 dp&#xff0c;由于按空格需要很大的力气导致马蜂被迫改变。后来忍不住了顶着疼痛按空格。8:30 过了样例&#xff0c;但是没有大样…

基于多种主题分析、关键词提取算法的设计与实现【TF-IDF算法、LDA、NMF分解、BERT主题模型】

文章目录有需要本项目的代码或文档以及全部资源&#xff0c;或者部署调试可以私信博主一、项目背景二、研究目标与意义三、数据获取与处理四、文本分析与主题建模方法1. 传统方法探索2. 主题模型比较与优化3. 深度语义建模与聚类五、研究成果与应用价值六、总结与展望总结每文一…

MDC(Mapped Diagnostic Context) 的核心介绍与使用教程

关于日志框架中 MDC&#xff08;Mapped Diagnostic Context&#xff09; 的核心介绍与使用教程&#xff0c;结合其在分布式系统中的实际应用场景&#xff0c;分模块说明&#xff1a; 一、MDC 简介 MDC&#xff08;映射诊断上下文&#xff09; 是 SLF4J/Logback 提供的一种线程…

Linux随记(二十一)

一、highgo切换leader&#xff0c;follow - 随记 【待写】二、highgo的etcd未授权访问 - 随记 【待写】三、highgo的etcd未授权访问 - 随记 【待写】3.2、etcd的metric未授权访问 - 随记 【待写】四、安装Elasticsearch 7.17.29 和 Elasticsearch 未授权访问【原理扫描】…

Java环境配置之各类组件下载安装教程整理(jdk、idea、git、maven、mysql、redis)

Java环境配置之各类组件下载安装教程整理&#xff08;jdk、idea、git、maven、mysql、redis&#xff09;1.[安装配置jdk8]2.[安装配置idea]3.[安装配置git]4.[安装配置maven]5.[安装配置postman]6.[安装配置redis和可视化工具]7.[安装配置mysql和可视化工具]8.[安装配置docker]…

配置https ssl证书生成

1.可用openssl生成私钥和自签名证书 安装opensslsudo yum install openssl -y 2.生成ssl证书 365天期限sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \-keyout /etc/ssl/private/nginx-selfsigned.key \-out /etc/ssl/certs/nginx-selfsigned.crt3、按照提示编…

编程语言Java——核心技术篇(四)集合类详解

言不信者行不果&#xff0c;行不敏者言多滞. 目录 4. 集合类 4.1 集合类概述 4.1.1 集合框架遵循原则 4.1.2 集合框架体系 4.2 核心接口和实现类解析 4.2.1 Collection 接口体系 4.2.1.1 Collection 接口核心定义 4.2.1.2 List接口详解 4.2.1.3 Set 接口详解 4.2.1.4…

GaussDB 数据库架构师(八) 等待事件(1)-概述

1、等待事件概述 等待事件&#xff1a;指当数据库会话(session)因资源竞争或依赖无法继续执行时&#xff0c;进入"等待"状态&#xff0c;此时产生的性能事件即等待事件。 2、等待事件本质 性能瓶颈的信号灯&#xff0c;反映CPU,I/O、锁、网络等关键资源的阻塞情况。…

五分钟系列-文本搜索工具grep

目录 1️⃣核心功能​​ ​​2️⃣基本语法​​ 3️⃣​​常用选项 & 功能详解​​ ​​4️⃣经典应用场景 & 示例​​ 5️⃣​​重要的提示 & 技巧​​ ​​6️⃣总结​​ grep 是 Linux/Unix 系统中功能强大的​​文本搜索工具​​&#xff0c;其名称源自 …

Java面试题及详细答案120道之(041-060)

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

【尝试】本地部署openai-whisper,通过 http请求识别

安装whisper的教程&#xff0c;已在 https://blog.csdn.net/qq_23938507/article/details/149394418 和 https://blog.csdn.net/qq_23938507/article/details/149326290 中说明。 1、创建whisperDemo1.py from fastapi import FastAPI, UploadFile, File import whisper i…

Visual Studio 的常用快捷键

Visual Studio 作为主流的开发工具&#xff0c;提供了大量快捷键提升编码效率。以下按功能分类整理常用快捷键&#xff0c;涵盖基础操作、代码编辑、调试等场景&#xff08;以 Visual Studio 2022 为例&#xff0c;部分快捷键可在「工具 > 选项 > 环境 > 键盘」中自定…

Triton Server部署Embedding模型

在32核CPU、无GPU的服务器上&#xff0c;使用Python后端和ONNX后端部署嵌入模型&#xff0c;并实现并行调用和性能优化策略。方案一&#xff1a;使用Python后端部署Embedding模型 Python后端提供了极大的灵活性&#xff0c;可以直接在Triton中运行您熟悉的sentence-transformer…

Java动态调试技术原理

本文转载自 美团技术团队胡健的Java 动态调试技术原理及实践, 通过学习java agent方式进行动态调试了解目前很多大厂开源的一些基于此的调试工具。 简介 断点调试是我们最常使用的调试手段&#xff0c;它可以获取到方法执行过程中的变量信息&#xff0c;并可以观察到方法的执…

人工智能-python-OpenCV 图像基础认知与运用

文章目录OpenCV 图像基础认知与运用1. OpenCV 简介与安装OpenCV 的优势安装 OpenCV2. 图像的基本概念2.1. 图像的存储格式2.2. 图像的表示3. 图像的基本操作3.1. 创建图像窗口3.2. 读取与显示图像3.3. 保存图像3.4. 图像切片与区域提取3.5. 图像大小调整4. 图像绘制与注释4.1. …