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

时间:2019-05-11 01:20:03

标签: kubernetes liquibase kubernetes-pod

我在项目中使用liquibase,到目前为止,它工作正常。
我添加了一个新的变更集,该变更集在本地运行良好,部署后,容器的状态如下所示: “ liquibase:正在等待更改日志锁定...”

部署的限制资源未设置。
表“ databasechangeloglock”的更新无法正常工作,因为pod不断锁定它。
我该如何解决?

2 个答案:

答案 0 :(得分:5)

请参见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

注意:这可能是不得已的方法。如果您对变更日志锁定的麻烦多于获得任何好处(例如仅运行该应用程序的一个实例而实际上并不需要锁定),则可以选择扩展。它可能不是“最佳”解决方案,但根据您的需求,当然可以选择。链接中的自述文件也这样说。

答案 1 :(得分:2)

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

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

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

WHERE id=1;

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