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
英文地址,請注明出處:http://en.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. …