如果我有一个长期运行的Postgres查询,而常规的“ kill [pid]”不起作用,而pg_cancel_backend不起作用,该怎么办?
如果我有一个长期运行的Postgres查询,而常规的“ kill [pid]”不起作用,而pg_cancel_backend不起作用,该怎么办?
Answers:
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,则可以尝试pg_terminate_backend
。
伯里斯在他的上述陈述中是正确的...
如果您正在尝试SHUTDOWN
服务器,对我来说:
我只是想删除已淘汰的数据库/架构,这些数据库/架构仍然具有缠绵的联系,它不会放任自流。
因此,为了回答您的问题,
如果我有一个长期运行的Postgres查询...
pg_cancel_backend不起作用...
我该怎么办?
与以任何方式关闭服务器无关。
我也看到了这种pg_cancel_backend()
行不通的行为。并希望分享我的工作解决方案。
到目前为止,我还没有看到任何形式的数据“丢失”的问题。
同样,我也不想杀死Active
查询。
-我以用户“ A”身份登录,会话或PID为777777。
-并尝试强制断开与打开为123456789的用户“ A”的另一个会话
-这是一个正在休眠的连接,这就是为什么我也在
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';
-注意:我试图使用荒谬的pid#来帮助防止人们复制,粘贴和破坏他们的生活。
-注意:默认情况下,postgres仅允许您杀死在USER中登录后运行的进程,
-注意:但是您已经知道了。
希望这可以帮助。=)
〜杰伊