1

有时,即使我在 pgAdmin 中“停止”它,查询仍会继续运行,运行pg_cancel_backendpg_terminate_backend并从命令行杀死。我发现的唯一选择是完全停止并重新启动 postgres 服务(通常使用pg_ctl -m immediate)。我目前正在使用Postgres 9.1

是否有其他选项可以完全终止正在运行的进程?

4

2 回答 2

3

这不应该真的发生。问题后端在做什么?查看:

ps -C postgres -o pid,ppid,stat,start,time,%cpu,%mem,blocked,ignored,wchan:80,cmd

如果您知道,请替换-C postgres为。-p the_pid确保包括出现在宽chan行之后的进程名称。用整行更新您的答案。

您可能还想从后端获取回溯以查看它在做什么。您可能在 Linux 或 BSD given 上kill,因此请尝试:

gdb -p the_pid
(gdb) bt
... blah blah copy this blah ...
(gdb) q

例如:

gdb -p 914
......blah blah ........
(gdb) bt
#0  0x0000003c31ceacc3 in __select_nocancel () from /lib64/libc.so.6
#1  0x00000000005f73b6 in ?? ()
#2  0x00000000005f7c36 in SysLogger_Start ()
#3  0x00000000005f60b0 in PostmasterMain ()
#4  0x0000000000457039 in main ()
(gdb) q
A debugging session is active.

        Inferior 1 [process 914] will be detached.

Quit anyway? (y or n) y
Detaching from program: /usr/bin/postgres, process 914

如果可能,请先安装调试符号包。我的机器上没有 Pg 9.1,所以我上面的回溯不是很有用。请参阅Pg 维基文章

回溯可能很长,因此请考虑将其放在 pastebin 站点上,而不是直接放到您的问题中,而只是在此处链接到它。

于 2012-09-19T23:40:07.463 回答
1

回顾一下,有些地方 PostgreSQL 后端正在做一些有CHECK_FOR_INTERRUPTS一段时间没有工作的地方。这些补丁在可能的情况下被避免,但仍然会发生。

如果您发现此类情况,请报告。

在后端检查中断之前,您无法完全停止后端,因此您必须简单地等待。或者您可以重新启动整个数据库服务器。如果你用 (eg) 硬杀死感兴趣的后端kill -9,PostgreSQL 将shared_buffers视为潜在损坏并立即强制重启,断开所有当前会话。因此,您不妨改用立即关机。

于 2014-02-10T08:03:06.937 回答