如何终止postgresql 8.3会话?

时间:2013-03-21 21:55:53

标签: postgresql postgresql-8.3

我试图在postgresql 8.3中终止会话(特定会话或所有会话,无关紧要)并且我在执行此操作时遇到了麻烦。我知道在较新版本(8.4及更高版本)中有一个pg_terminate_backend命令可以解决这个问题,但这在postgresql 8.3中不可用。如果我使用pg_stat_activity,我可以看到所有活动的会话但无法终止它们。

解决方案不一定是sql命令,但我希望它独立于正在使用的操作系统(即没有DOS / UNIX命令)。

在Windows服务中停止和启动postgres服务可以很好地工作,但这是一种特定于操作系统的方法。但是,使用'pg_ctl restart -D DATA_DIR'不会停止服务。实际上,在我尝试执行此操作时,使用pg_ctl尝试重新启动服务会导致一些奇怪的行为。如果有一种方法我可以以某种方式使用pg_ctl来强制关闭进程,就像我假设的那样,那么我可以使用它。

无论如何,我正在寻找一种方法来终止postgresql 8.3中非平台特定的一个或所有会话。任何帮助都会很棒!

2 个答案:

答案 0 :(得分:7)

您可以使用pg_cancel_backend():

select pg_cancel_backend(55555);

您可以将此与pg_stat_activity一起使用。例如:

select pg_cancel_backend(procpid)
from pg_stat_activity where current_query='<IDLE>';

如果这不起作用,你可以试试这个:

pg_ctl kill -TERM pid

那应该是OS独立的。我不确定行为是否存在任何真正的差异。

除此之外,您可以尝试停止并启动服务器,但是您指出了奇怪的行为。 (什么样的?)

最后,对于OS特定选项,在linux上你当然可以尝试使用kill命令。 kill -15SIGTERM)是安全的;这基本上是pg_terminate_backend使用的:kill -15 <pid>kill -9 is moderately unsafe and you should use it only as a last resort

答案 1 :(得分:0)

su - posgres
psql


SELECT pg_terminate_backend(pg_stat_activity.procpid)  FROM  pg_stat_activity  WHERE  procpid <> pg_backend_pid()  AND datname = 'dbname' ;
drop database "database name";