2009-04-07 52 views

回答

20

Combine pg_terminate_backend功能和pg_stat_activity系統視圖。在PostgreSQL的8.4

+2

pg_cancel_backend()不斷開,它只取消當前查詢。接下來的查詢可以在任何時候使用仍然存在的舊連接。 – 2010-08-10 19:07:08

+0

固定。謝謝! – 2010-08-10 20:20:15

0

我在郵件列表中發現了this thread。它建議使用SIGTERM來導致客戶端斷開連接。

不如db2 force application all乾淨。

36

殺敵空閒進程:

SELECT procpid, (SELECT pg_terminate_backend(procpid)) as killed from pg_stat_activity 
    WHERE current_query LIKE '<IDLE>'; 
+0

像Postgres v9.1.4中的魅力一樣工作。感謝您的見解! – 2012-08-24 02:51:53

1

大概然後更重手的方法應該是使用,但:

for x in `ps -eF | grep -E "postgres.*idle"| awk '{print $2}'`;do kill $x; done 
5

This SO answer精美的解釋(從araqnid全報價水平規則之間,然後我再次):


T Ø標記數據庫「applogs」不接受新的連接:

update pg_database set datallowconn = false where datname = 'applogs'; 

另一種可能性是,撤銷「連接」訪問數據庫中的客戶端角色(一個或多個)上。

將用戶從數據庫斷開=終止後端。所以,從「applogs」數據庫斷開所有其他用戶,例如:

select pg_terminate_backend(procpid) 
from pg_stat_activity 
where datname = 'applogs' and procpid <> pg_backend_pid(); 

一旦你完成了這兩個,你連接到「applogs」的唯一用戶。儘管在後端實際完成斷開連接之前實際上可能會有延遲?從MarkJL


更新:有確實是後臺完成斷開連接之前的延遲。

現在我再說一次:說到這裏,請記住,PostgreSQL 9.2及更高版本中的procpid列已重命名爲pid

我認爲這是比米倫A.拉德夫回答這,雖然在技術上是相同的,不附帶使用示例和現實生活的建議更加有幫助。

4

我張貼我的答案,因爲我不能在我的腳本,服務器9.3使用其中的任何:

psql -U postgres -c "SELECT pid, (SELECT pg_terminate_backend(pid)) as killed from pg_stat_activity WHERE datname = 'my_database_to_alter';" 

下一行,你可以做任何事情喲想「my_database_to_alter」。正如你所看到的,你可以從「postgres」數據庫執行查詢,該數據庫幾乎存在於每個postgresql安裝中。

做超級用戶和超出問題數據庫本身對我來說是完美的。

相關問題