You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Liquibase至4.31.0后自动生成快照导致变更执行变慢的原因及禁用方法咨询

升级Liquibase至4.31.0后自动生成快照导致变更执行变慢的原因及禁用方法咨询

问题原因

Liquibase在4.27.0版本引入了变更总结(Update Summary)功能:当你设置liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.LOG)时,为了生成详细的变更执行日志总结,Liquibase会默认在每个changeset执行完成后自动创建数据库快照——这个快照用于对比变更前后的数据库状态,从而输出对象创建/修改/删除的详细信息。

在4.26.0及更早版本中,该特性要么不存在,要么默认未开启,因此你之前不会看到每个changeset对应的快照生成日志。

解决方法

根据你的需求,有两种方案可以禁用这种逐变更的快照生成行为:

方案1:完全关闭变更总结输出

如果你不需要变更执行的总结日志,直接将UpdateSummaryOutputEnum.LOG改为UpdateSummaryOutputEnum.OFF即可,Liquibase会立即停止触发每个changeset后的快照生成:

var resourceAccessor = new DirectoryResourceAccessor(pathToChangeLogFiles);
try (var liquibase = new Liquibase(changeLogFile, resourceAccessor, databaseConnection))
{
    Scope.enter(Map.of(Scope.Attr.ui.name(), new LoggerUIService()));
    // 关闭变更总结输出,彻底禁用快照触发逻辑
    liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.OFF);

    liquibase.update(contexts);
}

方案2:保留变更总结但禁用逐变更快照

如果你仍需要变更总结日志,但希望减少快照开销,可以通过Scope属性强制关闭SNAPSHOT_PER_CHANGESET开关——这样Liquibase仅会在整个update操作完成后生成一次最终快照,而非每个changeset都生成:

var resourceAccessor = new DirectoryResourceAccessor(pathToChangeLogFiles);
try (var liquibase = new Liquibase(changeLogFile, resourceAccessor, databaseConnection))
{
    // 在Scope中添加禁用单变更快照的配置
    Scope.enter(Map.of(
        Scope.Attr.ui.name(), new LoggerUIService(),
        Scope.Attr.SNAPSHOT_PER_CHANGESET.name(), false
    ));
    liquibase.setShowSummaryOutput(UpdateSummaryOutputEnum.LOG);

    liquibase.update(contexts);
}

验证效果

修改完成后重新执行变更,你会发现日志中不再出现每个changeset对应的[liquibase.snapshot] (main) INFO Creating snapshot条目,变更执行时间会回到4.26.0版本的水平。

备注:内容来源于stack exchange,提问作者Manuel K

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 09:19:31