异步执行长时间运行的 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 的 Spring Boot 未在 Docker 中执行