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

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

如果我有一个长时间运行的 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 只允许您终止以您的登录用户身份运行的进程,

——注意:但您已经知道这一点了。

希望这会有所帮助。=)

〜杰伊

相关内容