如何修复未清除的 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 脚本[关闭]