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

12 postgresql sql database

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

Bri*_*les 11

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.

  • @Bribles **请在您的帖子中添加警告!如果尝试,SIGQUIT 将导致严重的问题。我只是这样做了,但它引起了很多问题 - 我希望我能回到过去并阻止自己按下 Enter 键!** (2认同)

小智 9

除非您的目标是强行关闭整个服务器,否则您永远不应该杀死 -9 任何 postgres 进程。您可以使用以下命令终止任何不响应来自 shell 的 pg_cancel_backend() 调用的进程

kill <pid>
Run Code Online (Sandbox Code Playgroud)

即不是-9。请注意,我曾多次看到,由于进程挂起在某个循环中等待网络连接上的数据,因此即使这样也不起作用。如果我没记错的话,杀死客户端进程可以解决这个问题。


小智 6

如果你有最新的 Postgres,你可以尝试一下pg_terminate_backend