pg_cancel_backend不起作用怎么办?


8

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

Answers:


8

你应该从来没有杀死任何-9 postgres进程,除非你的目标是使整个服务器关闭强行。您可以使用以下命令杀死任何不响应shell的pg_cancel_backend()调用的进程:

kill <pid>

即不是-9。请注意,我已经见过几次由于进程被挂起而在某些循环中等待网络连接上的数据,甚至无法正常工作的情况。如果我没记错的话,杀死客户端进程就可以解决这个问题。


8

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


+1 PostgreSQL对每个连接使用一个进程,因此您可以杀死一个进程而不会影响其他连接。我不确定是否有数据损坏的可能性,但我真的对此表示怀疑。
David Pashley

我以为将kill -9发送到postgres进程是灾难性的,因为它可能会使数据库处于恢复模式,这可能会使数据库长时间无法使用。


该链接将向服务器发送kill -9 。我说的是单个查询的pid。还是同一件事?

2
@Bribles 请在您的帖子中添加警告!如果尝试过,SIGQUIT将导致严重问题。我就是这么做的,这引起了很多问题-我希望我能及时回到过去,并阻止自己按Enter键!
ADTC


1

伯里斯在他的上述陈述中是正确的...

如果您正在尝试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中登录后运行的进程,

-注意:但是您已经知道了。

希望这可以帮助。=)

〜杰伊

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.