如果我有一个长时间运行的 Postgres 查询,并且常规“kill [pid]”不起作用,并且 pg_cancel_backend 不起作用,我该怎么办?
答案1
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
。
答案2
你应该绝不kill -9 任何 postgres 进程,除非你的目标是强制关闭整个服务器。你可以使用以下命令杀死任何不响应来自 shell 的 pg_cancel_backend() 调用的进程
kill <pid>
即不是 -9。请注意,我曾见过几次,由于进程挂起并等待网络连接上的数据,因此即使这样也无法正常工作。如果我没记错的话,终止客户端进程可以解决这个问题。
答案3
如果您有最新的 Postgres,您可以尝试pg_terminate_backend
一下。
答案4
布里布尔斯他的上述陈述是正确的……
如果您正在尝试访问SHUTDOWN
服务器,但对我来说:
我只是想删除已经退役的数据库/模式,但它们之间仍然有挥之不去的连接,无法放弃。
那么,回答你的问题,
如果我有一个长时间运行的 Postgres 查询...
pg_cancel_backend 不起作用......
我应该怎么办?
不相关的以任何方式关闭服务器。
我也见过这种pg_cancel_backend()
不起作用的行为。并想分享我的解决方案。
到目前为止我还没有发现任何与数据“丢失”有关的问题。
再说一遍,我也没有试图终止Active
查询。
——我以用户“A”身份登录,会话或 PID 为 777777。
-- 并尝试强制断开用户“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';
-- 有趣的是,结果表明取消是真实的,但仍然存在。
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
-- 第二次尝试
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 只允许您终止以您的登录用户身份运行的进程,
——注意:但您已经知道这一点了。
希望这会有所帮助。=)
〜杰伊