如何修复未清除的 Liquibase 数据库锁

Posted

技术标签:

【中文标题】如何修复未清除的 Liquibase 数据库锁【英文标题】:How to fix Liquibase database lock that does not get cleared 【发布时间】:2019-09-28 21:17:00 【问题描述】:

我在项目中使用 liquibase,到目前为止它运行良好。 我添加了一个新的变更集,它在本地运行良好,一旦部署,容器的状态就会挂起,并带有以下语句: “liquibase:等待更新日志锁定...”。 未设置部署的限制资源。 表“databasechangeloglock”的更新不起作用,导致 pod 一直锁定它。 我该如何解决这个问题?

【问题讨论】:

见 ***.com/q/61387510/1704634 ,你可以使用 liquibase-sessionlock 扩展,它可以从意外终止中恢复 这能回答你的问题吗? Is there a configuration for removing LiquiBase DATABASE CHANGELOGLOCK automatically after a certain time or on app restart? 【参考方案1】:

如果你完全确定没有活动的迁移(pod)在运行,你可以手动释放锁:

UPDATE <your table name> (f.e. DATABASECHANGELOG)

SET locked=false, lockgranted=null, lockedby=null

WHERE id=1;

通常锁会自动清除,您可能还需要检查数据库连接的隔离级别。

【讨论】:

我已经这样做了,但是一旦清除,它就会被同一个 pod 再次锁定。【参考方案2】:

见other question here。如果锁发生并且进程意外退出,那么锁将保留在那里。

根据this answer,直接运行SQL即可解除锁:

UPDATE DATABASECHANGELOGLOCK SET LOCKED=0, LOCKGRANTED=null, LOCKEDBY=null where ID=1;

注意:根据您的数据库引擎,您可能需要使用 FALSE 或 'f' 而不是 0 来表示 LOCKED 值。

根据您的问题,您的进程本身正在创建一个新锁并且每次仍然失败,那么很可能是该进程由于不同的原因退出/失败(或以错误的顺序检查锁。

另一种选择是考虑Liquibase No ChangeLog Lock extension。

注意:这可能是最后的手段。如果您在更改日志锁定方面遇到的麻烦多于获得任何好处(例如,仅运行应用程序的一个实例并且实际上不需要锁定),则扩展可能是一种选择。它可能不是“最佳”解决方案,但根据您的需要肯定是一种选择。链接中的 README 也说明了这一点。

【讨论】:

以上是关于如何修复未清除的 Liquibase 数据库锁的主要内容,如果未能解决你的问题,请参考以下文章

Liquibase ERROR 数据库 URL 未指定为参数或属性文件

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

如何用 Spring 解锁 Liquibase 锁?

即使数据库解锁,liquibase 锁定异常

使用 liquibase/flyway 类似 Terraform 的自动更新数据库,可能吗?

markdown Liquibase:等待更改日志锁...