我在项目中使用liquibase,到目前为止,它工作正常。
我添加了一个新的变更集,该变更集在本地运行良好,部署后,容器的状态如下所示:
“ liquibase:正在等待更改日志锁定...” 。
部署的限制资源未设置。
表“ databasechangeloglock”的更新无法正常工作,因为pod不断锁定它。
我该如何解决?
答案 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;
通常,该锁定会自动清除,您可能还需要检查数据库连接的隔离级别。