如果我有一个长期运行的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,但我不会。)
您可以直接使用kill或pg_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的进程,
– 注:但你已经知道了。
希望这可以帮助。 =)
〜周杰伦