如何终止postgresql 8.3会话?

如何终止postgresql 8.3会话?,postgresql,postgresql-8.3,Postgresql,Postgresql 8.3,我试图在postgresql 8.3中终止一个会话(一个特定会话或所有会话,无所谓),但在这方面遇到了问题。我知道在较新的版本(8.4及更高版本)中有一个pg_terminate_backend命令可以实现这一点,但这在postgresql 8.3中不可用。如果我使用pg_stat_activity,我可以看到所有活动但无法终止的会话 解决方案不一定是sql命令,但我希望它独立于正在使用的操作系统(即没有DOS/UNIX命令) 在windows服务中停止和启动postgres服务非常有效,但这是

我试图在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尝试重新启动服务会导致一些奇怪的行为。如果有一种方法可以像我假设windows那样使用pg_ctl强制关闭进程,那么我可能可以使用它


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

您可以使用pg\u cancel\u backend():

您可以将其用于pg_stat_活动。例如:

select pg_cancel_backend(procpid)
from pg_stat_activity where current_query='<IDLE>';
这应该是独立于操作系统的。我不确定在行为上是否有真正的区别

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

最后,对于特定于操作系统的选项,在linux上,您当然可以尝试使用kill命令<代码>杀死-15(
SIGTERM
)是安全的;这基本上就是
pg\u terminate\u backend
使用的:
kill-15

su-posgres
psql
从pg_stat_活动中选择pg_terminate_backend(pg_stat_activity.procpid),其中procpid pg_backend_pid()和datname='dbname';
删除数据库“数据库名称”;

您真的应该考虑升级到受支持的版本。8.3真的很老了(顺便说一句:没有“DOS”命令来停止Postgres,因为Postgres不在“DOS”上运行”)@a_horse_,没有名字,我知道windows不再真正使用“DOS”。我使用这个术语主要是为了区分windows GUI方法和命令行方法。我想我应该改掉误用这个词的习惯,找另一个简单的词来称呼它,比如CMD或者别的什么。Re
kill-9
请阅读为什么这不是一个好主意。请不要建议人们在没有链接到详细解释的情况下使用
kill-9
Pg;只要你不做傻事就可以了,但你必须小心
kill-9
将始终导致PostgreSQL崩溃并重新启动,中止所有正在运行的语句和未提交的事务。谢谢!pg_ctl kill为我工作。需要指出的一点是,不应该出现“杀死”类型之前的破折号。下面是正确的命令:pg_ctl kill TERMpid@CraigRinger:谢谢你的澄清。在我执行kill时,所有会话都应该处于空闲状态,这样重新启动就不会有问题。此外,pg_cancel_backend(pid)不会终止进程,它只是取消proc正在处理的查询。建议对您的答案添加一些解释,以便其他用户对答案有一个清晰的理解。
select pg_cancel_backend(procpid)
from pg_stat_activity where current_query='<IDLE>';
pg_ctl kill -TERM pid
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";