异步执行长时间运行的 liquibase 数据库更新

Posted

技术标签:

【中文标题】异步执行长时间运行的 liquibase 数据库更新【英文标题】:Execute long running liquibase database updates asynchronously 【发布时间】:2018-02-27 01:08:18 【问题描述】:

我们正在使用 liquibase 来管理应用程序底层关系数据库结构的变化。我们使用 PostgreSQL 作为数据库后端。

现在有数百万个条目的表,我们需要为其中一些大表添加索引。由于表的大小,索引创建需要相当长的时间。这会阻止应用程序启动,因为 liquibase 变更集是在应用程序的启动阶段执行的,以确保在应用程序实际运行之前可以使用适当的持久性后端。

虽然出于显而易见的原因需要在应用程序启动之前进行结构更改,但可以在应用程序已经运行时添加索引。因此我的问题是:

有没有办法使用 liquibase 异步执行索引创建?

我们已经尝试使用CONCURRENT option provided by PostgreSQL。这有助于在应用程序运行时创建索引,因为相应的表不会被索引创建锁定。但相应的 liquibase 变更集仍将等待索引创建完成,然后再执行下一个变更集。

【问题讨论】:

我认为在 liquibase 中没有这样的机制。异步运行任何东西都意味着在以后的某个时间点以某种方式同步它(比如在索引创建完成时有一个回调)。 Liquibase 正在跟踪所有更改和日志,无论它们是否成功应用于数据库。也可以使用结果来控制进一步的执行,例如“当变更集 x 不成功时停止整个更新”。如果某些东西异步运行,这是不可能的。我并不是说这根本不可能,我只是认为这目前还没有在 liquibase 中实现...... 这个@dpr 运气好吗? 【参考方案1】:

这不是直接可能的,但您可以解决该问题:

您需要在运行 liquibase 之前手动运行索引创建。 (这将允许您使用“并发”选项)。

为了保留更改记录,您可以将索引创建脚本(不带“concurrently”选项)并以 onFail="MARK_RAN " 为前提条件添加到 liquibase。

当 liquibase 下次运行时,它会将变更集标记为运行。

【讨论】:

以上是关于异步执行长时间运行的 liquibase 数据库更新的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase - 执行前测试变更集

在生产环境中执行 liquibase 更新

如何从数据库中删除最后执行的 liquibase 变更集

使用 Liquibase 的 Spring Boot 未在 Docker 中执行

在重新部署 .ear 文件期间未执行 Liquibase 脚本[关闭]

Liquibase maven插件不起作用