2. Liquibase 核心概念:ChangeLog、ChangeSet、DatabaseChangeLog表、ID与Author的命名规范
在深入使用Liquibase进行数据库版本管理之前,必须透彻理解其最核心的四个概念:ChangeLog(变更日志)、ChangeSet(变更集)、DatabaseChangeLog表(追踪表)以及ID与Author(唯一标识)。这四个要素构成了Liquibase的骨架,决定了迁移脚本如何组织、如何执行、如何追踪。
2.1 ChangeLog:变更日志的根容器
ChangeLog是Liquibase迁移的入口文件,通常是一个XML、YAML、JSON或SQL格式的文件。它作为根容器,定义了数据库变更的版本、作者、上下文以及包含的所有ChangeSet。
一个典型的XML格式ChangeLog结构如下:
<?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.23.xsd">
<include file="changelog/001_create_users_table.xml"/>
<include file="changelog/002_add_email_column.xml"/>
</databaseChangeLog>
2.2 ChangeSet:原子变更单元
ChangeSet是Liquibase中最小的、不可分割的变更单元。每个ChangeSet代表一次具体的数据库操作,例如创建表、添加列、创建索引或插入数据。每个ChangeSet必须包含两个属性:id 和 author,这两个属性共同构成ChangeSet的唯一标识。
| 属性 | 说明 | 示例值 |
|---|---|---|
| id | 变更集的唯一编号,通常使用数字或语义化名称 | 1、001、create-users-table |
| author | 变更集的创建者,通常使用用户名或邮箱 | zhangsan、devops@company.com |
| changes | 具体的数据库操作(如createTable、addColumn) | 一个或多个变更标签 |
<changeSet id="1" author="zhangsan">
<createTable tableName="users">
<column name="id" type="int" autoIncrement="true">
<constraints primaryKey="true"/>
</column>
<column name="username" type="varchar(50)">
<constraints nullable="false" unique="true"/>
</column>
<column name="created_at" type="timestamp"/>
</createTable>
</changeSet>
2.3 DatabaseChangeLog表:变更追踪的基石
当Liquibase首次对数据库执行迁移时,会自动创建两张追踪表:DATABASECHANGELOG 和 DATABASECHANGELOGLOCK。这两张表是Liquibase实现增量迁移和并发控制的核心。
DATABASECHANGELOG 表记录了所有已执行的ChangeSet的详细信息,包括文件名、ID、作者、执行时间、MD5校验和、执行上下文等。Liquibase通过查询这张表来判断哪些ChangeSet已经执行过,哪些需要执行。
| 字段名 | 类型 | 说明 |
|---|---|---|
ID |
VARCHAR(255) | ChangeSet的id属性值 |
AUTHOR |
VARCHAR(255) | ChangeSet的author属性值 |
FILENAME |
VARCHAR(255) | ChangeSet所在的ChangeLog文件路径 |
DATEEXECUTED |
TIMESTAMP | 执行时间 |
ORDEREXECUTED |
INT | 执行顺序号 |
MD5SUM |
VARCHAR(35) | ChangeSet内容的MD5校验和,用于检测脚本是否被篡改 |
TAG |
VARCHAR(255) | 可选的标签,用于标记版本点 |
DATABASECHANGELOGLOCK 表用于防止多个Liquibase实例同时执行迁移操作,确保并发安全。
2.4 ID与Author的命名规范
ID和Author的组合(加上文件名)构成了ChangeSet的全局唯一标识。合理的命名规范可以显著提升团队协作效率和迁移脚本的可维护性。
ID命名规范
- 数字递增法: 使用纯数字,如
1、2、3。简单直接,但多人协作时容易冲突。 - 时间戳法: 使用时间戳,如
20250101-1200。可以避免冲突,但可读性较差。 - 语义化命名法: 使用描述性名称,如
create-users-table、add-email-column。可读性最好,推荐使用。 - JIRA/需求编号法: 使用需求编号,如
PROJ-1234。适合与项目管理工具联动。
Author命名规范
- 用户名: 使用系统登录名,如
zhangsan、lisi。 - 邮箱: 使用公司邮箱,如
zhangsan@company.com。推荐方式,便于跨团队识别。 - 团队名: 使用团队名称,如
team-alpha。适合大型项目按团队划分。
create-users-table),Author使用邮箱(如 zhangsan@company.com)。这种组合既清晰又唯一,便于代码审查和问题追溯。
2.5 核心概念关系图
下图展示了ChangeLog、ChangeSet、DatabaseChangeLog表以及ID/Author之间的层级关系与执行流程:
2.6 核心概念对比总结
| 概念 | 角色 | 是否可执行 | 唯一标识 | 存储位置 |
|---|---|---|---|---|
| ChangeLog | 根容器,组织ChangeSet | 否(仅编排) | 文件路径 | 版本控制仓库 |
| ChangeSet | 原子变更单元 | 是 | id + author + filename | ChangeLog文件内 |
| DATABASECHANGELOG | 执行记录追踪表 | 否(被动记录) | 主键自增 | 目标数据库中 |
| ID + Author | ChangeSet的复合主键 | — | id + author | ChangeSet属性中 |