首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

Liquibase 實現 MySQL 數據庫版本控制與發布管理實戰

     編輯:MySQL 綜合教學

Liquibase 實現 MySQL 數據庫版本控制與發布管理實戰

數據庫結構變更無版本控制是運維大坑。Liquibase 以「變更集」為核心,支持 XML/YAML/SQL 多格式、多環境、回滾、分支合並,是資料庫 DevOps 首選工具。

核心概念

  • ChangeSet:最小變更單元,含 id、author、context、rollback
  • Changelog:主文件,include 子文件,控制執行順序
  • DATABASECHANGELOG:MySQL 端記錄表,存儲已執行變更的校驗和、標籤
  • DATABASECHANGELOGLOCK:分布式鎖,防止併發執行衝突

目錄結構規範

database/
├── db.changelog-master.xml          # 總入口
├── Release-2024-01/
│   ├── 001_create_users_table.sql
│   ├── 002_add_email_index.sql
│   └── 003_insert_init_data.sql
├── Release-2024-02/
│   ├── 010_alter_orders_add_status.sql
│   └── 011_create_order_items_table.sql
└── contexts/
    ├── dev.xml
    ├── test.xml
    └── prod.xml

主文件 db.changelog-master.xml

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog 
    xmlns="https://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="https://www.liquibase.org/xml/ns/dbchangelog
        https://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.20.xsd">

    <preConditions>
        <dbms type="mysql"/>
    </preConditions>

    <!-- 按發布版本順序 include,確保執行順序 -->
    <include file="Release-2024-01/001_create_users_table.sql" relativeToChangelogFile="true"/>
    <include file="Release-2024-01/002_add_email_index.sql" relativeToChangelogFile="true"/>
    <include file="Release-2024-01/003_insert_init_data.sql" relativeToChangelogFile="true"/>
    <include file="Release-2024-02/010_alter_orders_add_status.sql" relativeToChangelogFile="true"/>
    <include file="Release-2024-02/011_create_order_items_table.sql" relativeToChangelogFile="true"/>

</databaseChangeLog>

SQL 格式 ChangeSet 範例(推薦 DBA 友好)

-- Release-2024-01/001_create_users_table.sql
--liquibase formatted sql

--changeset zhangsan:202401_001_create_users_table context:dev,test,prod
CREATE TABLE `users` (
    `id` BIGINT NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(50) NOT NULL,
    `email` VARCHAR(100) NOT NULL,
    `password_hash` CHAR(60) NOT NULL,
    `created_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (`id`),
    UNIQUE KEY `uk_username` (`username`),
    UNIQUE KEY `uk_email` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

--rollback DROP TABLE `users`;

XML 格式 ChangeSet 範例(工具友好、支持複雜邏輯)

<changeSet author="lisi" id="202401_002_add_email_index" context="dev,test,prod">
    <createIndex tableName="users" indexName="idx_email_domain">
        <column name="email"/>
    </createIndex>
    <rollback>
        <dropIndex tableName="users" indexName="idx_email_domain"/>
    </rollback>
</changeSet>

常用命令實戰

操作命令說明
校驗語法liquibase validate --changelog-file=db.changelog-master.xmlCI/CD 必跑步驟
生成文檔liquibase dbDoc --changelog-file=... --output-dir=./doc輸出 HTML 數據字典
執行遷移liquibase update --changelog-file=... --contexts=prod按 context 過濾執行
打標籤liquibase tag Release-2024-01 --changelog-file=...標記發布版本,便於回滾
回滾到標籤liquibase rollback Release-2024-01 --changelog-file=...撤銷該標籤後所有變更
回滾到時間liquibase rollbackToDate "2024-01-15 10:00:00" --changelog-file=...時間點恢復
回滾條數liquibase rollbackCount 3 --changelog-file=...撤銷最近 3 個 ChangeSet
生成遷移 SQLliquibase updateSQL --changelog-file=... > migrate.sql審核/離線執行
對比兩庫liquibase diff --referenceUrl=jdbc:mysql://prod/... --url=jdbc:mysql://test/...結構差異報告
反向生成 Changelogliquibase generateChangeLog --changelog-file=... --url=jdbc:mysql://prod/...現有庫納管
列出鎖liquibase listLocks排查卡死
釋放鎖liquibase releaseLocks強制解鎖

Context 環境隔離策略

  • context:dev:僅開發環境執行(如測試數據插入)
  • context:test,prod:測試+生產執行(核心結構變更)
  • context:prod:僅生產執行(敏感數據遷移、權限變更)
  • 執行時:--contexts=prod 只跑 prod 標記的 ChangeSet

最佳實踐

  1. 一個 ChangeSet 一個邏輯變更,拒絕大而全
  2. 必寫 rollback,無法自動回滾(如 DROP COLUMN)需手寫補償 SQL
  3. id 唯一且有意義:作者_日期_序號_描述
  4. 禁止修改已執行 ChangeSet(校驗和會報錯),需新增修正 ChangeSet
  5. 代碼與 Changelog 同倉庫,MR 必須包含對應遷移
  6. CI/CD 流水線:validate → updateSQL(審核) → update(自動/手動確認)

MySQL 專用參數

liquibase \
  --driver=com.mysql.cj.jdbc.Driver \
  --url="jdbc:mysql://10.0.1.10:3306/prod_db?useUnicode=true&characterEncoding=utf8mb4&useSSL=false&serverTimezone=UTC" \
  --username=liquibase_user \
  --password='LiquiPassw0rd!' \
  --changelog-file=db.changelog-master.xml \
  --contexts=prod \
  --logLevel=INFO \
  update

引入 Liquibase,讓數據庫結構變更像代碼一樣「可版本、可審核、可回滾、可追溯」。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved