当pg_cancel_backend不起作用时,我应该如何终止进程?

时间:2012-09-19 21:02:44

标签: postgresql

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

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

2 个答案:

答案 0 :(得分:3)

这不应该发生。后端有什么问题?检查:

ps -C postgres -o pid,ppid,stat,start,time,%cpu,%mem,blocked,ignored,wchan:80,cmd
如果您知道的话,

-C postgres替换为-p the_pid。确保包含宽chan行后显示的流程名称。用整行更新你的答案。

您可能还希望从后端获得回溯以查看其正在执行的操作。您可能在kill处使用Linux或BSD,请尝试:

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,所以我上面的回溯并不是非常有用。请参阅the Pg wiki article

回溯可能会很长,所以请考虑将其放在pastebin网站上,而不是直接放到你的问题中,只是在这里链接到它。

答案 1 :(得分:1)

重新审视这个问题,有些地方PostgreSQL后端工作的地方有一段时间没有CHECK_FOR_INTERRUPTS。尽可能避免使用这些补丁,但仍然会发生。

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

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