Grails 应用程序在启动时卡住,因为 DATABASECHANGELOG 表被锁定
Posted
技术标签:
【中文标题】Grails 应用程序在启动时卡住,因为 DATABASECHANGELOG 表被锁定【英文标题】:Grails application gets stuck on startup because DATABASECHANGELOG table is locked 【发布时间】:2012-10-31 20:25:51 【问题描述】:我在 Heroku 上托管了一个使用数据库迁移插件的 Grails 应用程序。有时当应用程序重新启动时,它会在启动时卡住而没有任何帮助消息:
2012-11-12T11:21:06+00:00 app[web.1]: Configuring Spring Security Core ...
2012-11-12T11:21:06+00:00 app[web.1]: ... finished configuring Spring Security Core
2012-11-12T11:21:06+00:00 app[web.1]:
2012-11-12T11:21:22+00:00 heroku[web.1]: Stopping process with SIGKILL
2012-11-12T11:21:22+00:00 heroku[web.1]: Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
2012-11-12T11:21:24+00:00 heroku[web.1]: Process exited with status 137
2012-11-12T11:21:34+00:00 heroku[router]: Error H20 (App boot timeout) -> GET abc.herokuapp.com/ dyno= queue= wait=75000ms service= status=503 bytes=
2012-11-12T11:22:34+00:00 heroku[router]: Error H20 (App boot timeout) -> GET abc.herokuapp.com/ dyno= queue= wait=75000ms service= status=503 bytes=
2012-11-12T11:25:10+00:00 heroku[router]: Error H10 (App crashed) -> GET abc.herokuapp.com/ dyno= queue= wait= service= status=503 bytes=
经过一番调查,我发现这是因为 DATABASECHANGELOGLOCK 表上有一条记录,其列 LOCKED=TRUE。 当我手动将 LOCKED 值设置为 FALSE 并重新启动应用程序时,启动过程会顺利完成。
我的问题是:
-
如何找到导致数据库更改日志锁定的原因以及如何避免这种情况。
如果无法避免锁定,有什么方法可以在应用程序启动过程卡住之前清除锁定?
【问题讨论】:
【参考方案1】:当应用程序在引导过程中被终止并且数据库迁移无法完成其数据库事务时,我的项目中发生了此问题。
liquibase(数据库迁移使用的底层库)所做的是,它创建锁条目,然后启动数据库事务以处理所有需要应用的更改集。如果有任何机会,db 事务没有成功提交,锁条目将保留在DATABASECHANGELOGLOCK
。
同样的问题已经在liquibase forum 中提出过。
DATABASECHANGELOG
表记录了成功应用的 db 更改集,您可以使用dbm-db-doc 或DbDocController 来可视化这些信息(当然,您也可以直接使用 SQL 访问 db 表)。
【讨论】:
应用程序已经启动,当它被终止并留下锁定条目时,数据库已完全迁移。必须有另一个进程 - 除了引导进程 - 在应用程序生命周期中获取此锁。 我没有查看源代码,但我认为在检查是否有任何更改日志未决之前获取了锁。我怀疑同一个应用程序中还有其他“进程”可以访问DATABASECHANGELOGLOCK
。以上是关于Grails 应用程序在启动时卡住,因为 DATABASECHANGELOG 表被锁定的主要内容,如果未能解决你的问题,请参考以下文章