当pg_cancel_backend不起作用时,我该怎么办?

如果我有一个长期运行的Postgres查询,并且定期的“kill [pid]”不起作用,并且pg_cancel_backend不起作用,我该怎么办?

http://www.postgresql.org/docs/current/static/server-shutdown.html

pg_cancel_backend相当于将SIGINT发送到进程。
pg_terminate_backend同样适用于SIGTERM,但如果pg_cancel_backend不起作用,我不明白为什么pg_terminate_backend会。

如果你已经尝试了这些选项,你可以试试SIGQUIT。 文档说:“ 这只在紧急情况下才被推荐。

(如果你恨你的数据,希望它死了,你可以使用SIGKILL,但我不会。)

您可以直接使用killpg_ctl kill

除非你的目标是强迫整个服务器下线,否则你不应该杀死任何postgres进程。 你可以使用shell来终止任何不响应pg_cancel_backend()调用的进程

 kill <pid> 

即不是-9。 请注意,我曾经看过几次,即使这样做不起作用,因为进程正在等待一些循环中的数据在networking连接上。 如果我记得正确的话,杀死客户端进程就会照顾到这一点。

如果你有最近的Postgres,你可以尝试pg_terminate_backend

他上面的陈述中的贿赂是正确的…

如果你正试图SHUTDOWN服务器,对我来说,虽然:

我只是试图删除退休的数据库/架构,仍然有一个挥之不去的连接。

所以,要回答你的问题,

如果我有一个长期运行的Postgres查询…

pg_cancel_backend不起作用…

我该怎么办?

没有关系以任何方式closures服务器。

我也看到pg_cancel_backend()这种行为不起作用。 并想分享我的工作解决scheme。

目前为止,我还没有看到任何“丢失”数据的问题。

再次,我不是要杀死Active查询。

– 我以会话或PID 777777作为用户“A”login。

– 并尝试强制断开另一个会话从USER“A”打开为123456789

– 这是一个睡眠连接,这也是为什么我也在我的查询下面寻找idle

 SELECT * FROM pg_stat_activity WHERE pid = 123456789 AND STATE = 'idle'; 

– 尝试1

 SELECT pg_cancel_backend(pid) FROM pg_stat_activity WHERE pid = 123456789 AND STATE = 'idle'; 

– 足够有趣的结果表明,取消为TRUE但仍然存在。

 SELECT * FROM pg_stat_activity WHERE pid = 123456789 AND STATE = 'idle'; 

– 尝试2

 SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid = 123456789 AND STATE = 'idle'; 

– 而现在它不存在..

 SELECT * FROM pg_stat_activity WHERE pid = 123456789 AND STATE = 'idle'; 

– 注:我试图用rediculous pid#来帮助防止人们复制和粘贴并玷污他们的生命。

– 注意:默认情况下,postgres将只允许你杀死你在USER中login的进程,

– 注:但你已经知道了。

希望这可以帮助。 =)

〜周杰伦