有时候,即使我在pgAdmin中“停止”它,运行pg_cancel_backend
,pg_terminate_backend
并从命令行终止,查询仍将继续运行。我发现的唯一选择是完全停止并重新启动postgres服务(通常使用pg_ctl -m immediate
)。我目前正在使用 Postgres 9.1 。
还有其他选项可以完全终止正在运行的进程吗?
答案 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
视为可能已损坏并立即强制重启,断开所有当前会话。所以你不妨使用立即关机。