如何通过tag、label限制Liquibase changelogSync/SQL的同步范围
官方原生支持的范围控制实现方案,无需手动修改导出SQL
方案1:搭配Tag机制使用changelogSyncToTag命令(最推荐,无临时文件遗留)
这是Liquibase内置的能力,查阅changelogSync相关文档时很容易漏看——全量同步只是基础场景,同系列命令本身就支持按范围同步:
- 在基线变更文件
V2021.04.13.00.00.00__init01.yaml的末尾,追加一个空操作的标签变更集用来划定同步边界,原有generateChangeLog生成的内容完全不需要改动:databaseChangeLog: # 原有全量基线结构变更集保持原样 - changeSet: id: mark-baseline-boundary author: liquibase-baseline changes: - tagDatabase: tag: baseline_locked - 执行
liquibase changelogSyncToTag baseline_locked即可。该命令只会把主changelog中从开头到指定tag位置(含tag本身)的所有变更集,写入DATABASECHANGELOG表标记为已执行,完全不会同步tag之后的new-feature相关变更集。 - 同步完成后,后续执行
update、updateToTag等命令时,会正常匹配DATABASECHANGELOG的记录,从new-feature对应的变更集开始执行,不会打乱后续升级流程。
方案2:临时changelog子集同步(无需修改原有基线变更文件)
如果不想给基线文件加额外的标签变更集,可以用一次性临时changelog实现范围控制,全程不脱离官方命令体系:
- 新建一个仅用于同步的临时changelog文件(比如
changelog-sync-temp.yaml),内容仅引入需要同步的基线文件,不要引入新业务变更集:databaseChangeLog: - include: file: changes/V2021.04.13.00.00.00__init01.yaml relativeToChangelogFile: true - 执行命令时指定这个临时文件作为changelog入口:
liquibase --changelog-file=changelog-sync-temp.yaml changelogSync。 - 原理说明:Liquibase判断变更集是否已执行的依据是changeSet的id、author、对应文件路径三者生成的哈希值,临时文件里引入的init01文件,和后续主changelog里通过
includeAll加载的同一个文件,生成的哈希值完全一致,不会把同一个变更集识别成两个独立条目。同步完成后这个临时文件可以直接删除,后续正常用原有的主changelog配置即可。
实操避坑点
- 用临时changelog方案时,一定要保证临时配置里引入基线文件的相对路径,和后续主changelog扫描到的文件路径完全一致,否则会出现同一个变更集被重复执行的问题。
- 不推荐用导出SQL手动编辑的方式做同步,容易遗漏DATABASECHANGELOG表的必要字段(比如md5校验值、执行顺序、部署ID),后续会频繁出现变更集校验失败的问题。
- 原有主changelog里的
includeAll配置不需要做任何修改,两个方案都能兼容无差别加载目录的使用习惯。
内容的提问来源于stack exchange,提问作者ldeck
相关产品推荐
相关产品推荐

