4. ChangeLog 文件结构:XML / YAML / JSON / SQL 四种格式详解与选择策略

Liquibase 支持四种 ChangeLog 格式:XML、YAML、JSON 和 SQL。格式选择直接影响团队协作效率、版本控制可读性、迁移性能以及 GC 停顿风险。本章从解析性能、可维护性、变更追踪能力三个维度进行对比,并给出生产环境选择策略。

4.1 四种格式核心差异

特性 XML YAML JSON SQL
解析性能 中等(DOM/SAX) 较慢(缩进敏感) 快(原生解析器) 最快(纯文本)
可读性 良好(标签明确) 优秀(简洁) 一般(括号密集) 优秀(DBA 熟悉)
变更追踪 全量(支持所有 refactoring) 全量 全量 有限(仅原生 SQL)
版本控制 Diff 清晰(结构化) 清晰(缩进敏感) 较差(行级 diff 混乱) 清晰(逐行对比)
GC 压力 中等(对象树) 高(递归解析) 低(流式解析) 极低(无结构化对象)
适用场景 企业级、复杂变更 DevOps、快速迭代 API 集成、微服务 DBA 主导、性能敏感
性能提示:在 JVM 堆内存小于 512MB 的环境中,优先选择 JSON 或 SQL 格式,避免 YAML 的递归解析导致频繁 Young GC。

4.2 格式详解与代码示例

4.2.1 XML 格式(推荐企业级)

XML 是 Liquibase 原生格式,支持所有 refactoring 标签,IDE 自动补全完善。适合需要严格变更审计的团队。

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                        http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.20.xsd">
    <changeSet id="1" author="admin">
        <createTable tableName="user">
            <column name="id" type="bigint" autoIncrement="true">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="name" type="varchar(100)">
                <constraints nullable="false"/>
            </column>
        </createTable>
    </changeSet>
</databaseChangeLog>

4.2.2 YAML 格式(推荐 DevOps)

YAML 以缩进表示层级,代码量比 XML 减少约 40%。但缩进错误会导致解析失败,且大文件解析时 GC 压力较高。

databaseChangeLog:
  - changeSet:
      id: 1
      author: admin
      changes:
        - createTable:
            tableName: user
            columns:
              - column:
                  name: id
                  type: bigint
                  autoIncrement: true
                  constraints:
                    primaryKey: true
                    nullable: false
              - column:
                  name: name
                  type: varchar(100)
                  constraints:
                    nullable: false

4.2.3 JSON 格式(推荐微服务)

JSON 解析速度快,与 REST API 生态兼容性好。但可读性较差,不适合复杂嵌套变更。

{
  "databaseChangeLog": [
    {
      "changeSet": {
        "id": "1",
        "author": "admin",
        "changes": [
          {
            "createTable": {
              "tableName": "user",
              "columns": [
                {
                  "column": {
                    "name": "id",
                    "type": "bigint",
                    "autoIncrement": true,
                    "constraints": {
                      "primaryKey": true,
                      "nullable": false
                    }
                  }
                },
                {
                  "column": {
                    "name": "name",
                    "type": "varchar(100)",
                    "constraints": {
                      "nullable": false
                    }
                  }
                }
              ]
            }
          }
        ]
      }
    }
  ]
}

4.2.4 SQL 格式(推荐 DBA 主导)

SQL 格式直接编写原生 DDL/DML,解析开销最低,适合对性能极度敏感的场景。但无法使用 Liquibase 的自动回滚和上下文标签功能。

-- liquibase formatted sql
-- changeset admin:1
CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY NOT NULL,
    name VARCHAR(100) NOT NULL
);
-- rollback DROP TABLE user;
GC 风险提示:SQL 格式虽然解析最快,但若 ChangeLog 中包含大量 -- changeset 注释,Liquibase 仍会逐行扫描正则匹配。建议将 SQL 文件拆分为多个小文件,单文件不超过 500 行。

4.3 格式选择决策树

ChangeLog 格式选择决策树 团队技术背景? DBA 主导 → SQL 开发主导 → 继续 微服务 → JSON 单体/复杂 → 继续 严格审计 → XML 快速迭代 → YAML 选择建议: • 堆内存 < 512MB 或 GC 停顿敏感:优先 SQL 或 JSON • 需要完整变更追踪和回滚:XML 或 YAML • 团队以 DBA 为主:SQL 格式 + 手动回滚脚本

4.4 混合使用策略

生产环境推荐混合策略:根 ChangeLog 使用 XML 或 YAML 作为入口,内部通过 include 引入不同格式的子文件。

<!-- root.xml -->
<databaseChangeLog>
    <include file="init-schema.sql" relativeToChangelogFile="true"/>
    <include file="seed-data.yaml" relativeToChangelogFile="true"/>
    <include file="indexes.json" relativeToChangelogFile="true"/>
</databaseChangeLog>
性能调优要点:
  • SQL 文件用于批量 DDL(建表、加索引),解析最快,GC 压力最小。
  • YAML 用于种子数据插入,可读性好,但单文件不超过 200 行。
  • JSON 用于索引和约束变更,解析速度快,适合频繁修改的变更集。
  • XML 用于复杂 refactoring(如数据迁移、存储过程),保证变更追踪完整性。

4.5 格式迁移与兼容性

Liquibase 支持在项目中期切换 ChangeLog 格式,但需注意以下兼容性规则:

  • 格式互转:使用 liquibase convert 命令可将 XML 转为 YAML/JSON,但 SQL 格式无法反向转换。
  • ID 冲突:切换格式后,changeSet 的 id + author 组合必须保持唯一,否则 Liquibase 会视为新变更。
  • 上下文标签:SQL 格式不支持 <context> 标签,需通过文件名约定(如 prod-schema.sql)实现环境隔离。
  • 回滚支持:XML/YAML/JSON 支持自动生成回滚语句;SQL 格式必须手动编写 -- rollback 注释。
迁移风险:从 XML 切换到 YAML 时,注意 YAML 对缩进敏感,建议使用 liquibase validate 命令预先校验格式正确性,避免解析异常导致迁移中断。