use*_*276 2 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来强制关闭进程,就像我假设windows一样,那么我可以使用它.
无论如何,我正在寻找一种方法来终止postgresql 8.3中不是特定于平台的一个或所有会话.任何帮助都会很棒!
你可以使用pg_cancel_backend():
select pg_cancel_backend(55555);
Run Code Online (Sandbox Code Playgroud)
您可以将此与pg_stat_activity一起使用.例如:
select pg_cancel_backend(procpid)
from pg_stat_activity where current_query='<IDLE>';
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,你可以试试这个:
pg_ctl kill -TERM pid
Run Code Online (Sandbox Code Playgroud)
那应该是OS独立的.我不确定行为是否有任何真正的区别.
除此之外,你可以尝试停止和启动服务器,但你指出了奇怪的行为.(哪一种?)
最后,对于OS特定选项,在linux上你当然可以尝试使用kill命令.kill -15(SIGTERM)是安全的; 这基本上是pg_terminate_backend用于:kill -15 <pid>.kill -9是中度不安全的,你应该只使用它作为最后的手段.