2012-07-02 31 views
60

我正在使用Heroku和Crane Postgres选项,当我的本地机器崩溃时,我从本地机器上运行数据库查询。如果我运行Heroku Postgres - 终止挂起的查询(闲置在交易中)

select * from pg_stat_activity 

中的一个条目有

<IDLE> in transaction 
在current_query_text列

因此,我无法删除被终止的查询写入的表。我曾尝试使用pg_cancel_backend(N),它返回True,但似乎没有发生。

我该如何终止这个过程,以便我可以删除表?

+1

也许这个问题应该被改写为“具有Postgres的服务器也没有超级用户访问数据库没有root访问权限时,如何终止我自己的查询”。这似乎确实是一个非常好的问题......我不知道答案。 – tobixen

回答

89

这是一个普遍的答案,并不特定于heroku。一般来说,取消查询可能需要用户具有超级用户访问权限,无论是postgres服务器还是postgres数据库 - 看起来像普通用户不会在不询问DBA或系统管理员的帮助的情况下杀死自己的查询进程


查找PID通过运行该SQL:

SELECT procpid,* from pg_stat_activity 
WHERE current_query<>'<IDLE>' ORDER BY xact_start; 

你会发现在第一(左)列procpid,和第一(顶部)行很可能是查询你” d喜欢终止。我会假设下面的pid是1234。

您可以通过SQL取消查询(即没有shell访问,但你可能需要超级用户访问数据库):

select pg_cancel_backend(1234); 

这是“软”的方式...查询不会立即消失。如果你赶时间,试试这个:

select pg_terminate_backend(1234); 

如果你有shell访问也能做到这一点从壳:

kill -INT 1234 

如果没有帮助,使用:

kill 1234 

请勿:

kill -9 1234 

...这通常会导致整个postgres服务器在火中熄灭,那么您可以重新启动postgres。 Postgres的是相当强劲的,所以数据不会被破坏,但我建议不要在任何情况下;-)


使用“杀-9”,“空闲的交易”是指该交易不是以“提交”或“回滚”终止,这意味着该应用程序有问题或者没有正确设计用于事务数据库。应该避免长期的“闲置交易”,因为它也可能导致重大的性能问题。

+0

我试过pg_cancel_backend无济于事。我没有shell访问权限,而且我也不是超级用户,因此我无法使用pg_terminate_backend发送SIGKILL – alan

+0

您正在使用哪个版本的postgres? (提示:'select version()')。使用'pg_cancel_backend'时你会得到任何错误信息吗? – tobixen

+0

自己尝试使用pg_cancel_backend,因此得到错误消息“必须是超级用户来发信号通知其他服务器进程”......这意味着显然你需要服务器上的root权限或通过某些postgres超级用户的db访问权限(即postgres用户)杀死你自己的查询。这似乎有点吸引:-( – tobixen

33

试试这个:

select pg_terminate_backend(pid int) 

更多关于这一点,你可以找到here。这应该是这个问题的“更清洁”的解决方案,而不是通过系统查杀过程。

+7

这是解决方案。 pg_cancel_backend通常不起作用,但* terminate *是个诀窍。 –

+0

请添加如何让您的pid到您的答案 – mountainclimber

16

您可以在附加安装heroku-pg-extras和运行下面的命令来获得PID:

heroku pg:locks --app <your-app> 

然后,只需做:

heroku pg:kill <pid> --app <your-app> 

注意--force选项可以用来问题pg_terminate_backend将删除该查询的整个连接。

如果heroku pg:locks未列出任何内容,请尝试heroku pg:ps

欲了解更多信息,请查看:
https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall

+0

这节省了我这么多时间......谢谢! –

+0

完美,谢谢 – nrowegt

+0

谢谢。我仍然无法终止交易/ PID,但是......我的电脑在导入期间做了硬件冻结,我无法终止PID。 :( – dimitarvp