2012-09-19 63 views
1

偶爾,即使我在pgAdmin中「停止」它後,查詢仍將繼續運行,請運行pg_cancel_backendpg_terminate_backend並從命令行中終止。我發現的唯一選擇是完全停止並重新啓動postgres服務(通常使用pg_ctl -m immediate)。我目前使用Postgres 9.1當pg_cancel_backend不起作用時,我該如何終止進程?

是否有其他選項可以完全終止正在運行的進程?

回答

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

重訪一下,有些地方PostgreSQL後端在沒有CHECK_FOR_INTERRUPTS的地方工作了一段時間。儘可能避免這些補丁,但仍然會發生。

如果您發現這種情況,請舉報。

你不能幹淨地停止後端,直到它檢查中斷,所以你必須等待。或者您可以重新啓動整個數據庫服務器。如果你使用(例如)kill -9來強制殺死感興趣的後端,PostgreSQL將把shared_buffers視爲可能損壞,並立即強制重啓,斷開所有當前會話。所以你可以使用立即關機。

相關問題