2

我正在尝试终止 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 中非特定平台的一个或所有会话。任何帮助都会很棒!

4

2 回答 2

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

那应该是独立于操作系统的。我不确定行为是否有任何真正的差异。

除此之外,您可以尝试停止和启动服务器,但您指出了奇怪的行为。(哪一种?)

最后,对于特定于操作系统的选项,在 linux 上您当然可以尝试使用 kill 命令。kill -15( SIGTERM) 是安全的;这基本上是什么pg_terminate_backend用途:kill -15 <pid>. kill -9是适度不安全的,你应该只作为最后的手段使用它

于 2013-03-21T21:59:11.533 回答
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";
于 2015-04-21T12:12:45.660 回答