2010-07-06 96 views
15

我在PostgreSQL中有一個腳本,它每天晚上從轉儲中恢復測試數據庫。數據庫由應用程序服務器和進程使用連接池進行訪問,該連接池始終保持一些連接。PostgreSQL:暫時禁用連接

所以腳本恢復轉儲到my_temp_database。那麼它應該重命名my_databasemy_old_database,my_temp_databasemy_database,並最終下降my_old_database

如何從my_database斷開所有客戶端,超級用戶或不是,以便它可以重命名?我該如何暫時阻止他們重新連接?

有沒有更好的方法來做我所需要的?

回答

23

爲了紀念數據庫「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」的唯一用戶。儘管在後端實際完成斷開連接之前實際上可能會有延遲?

+0

哈,我希望它在8.3的工作。 – 2010-07-07 14:06:33

+0

在8.3中,您可以嘗試'從pg_stat_activity選擇pg_terminate_backend(pid);' – 2015-03-12 12:25:20

+0

@araqnid命令「update pg_database set datallowconn = false where datname ='applogs';」奇蹟般有效! 「REVOKE CONNECT ON DATABASE」不適用於我!向上!向上!向上!向上!向上!向上! – 2017-07-19 20:59:41

7

當您終止當前活動連接後,您也可以發出此命令,該命令將僅允許超級用戶登錄。這假設你仍然可以繼續訪問所有超級用戶。希望你不要把超級用戶權限交給任何人。

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

我有不同的使用場景,其中我想禁用每個人(包括超級用戶),永遠一個數據庫,而不是明明白白放棄它只是還沒有,要能在需要時迅速重新激活它。

這工作得很好的老8.3的Postgres:

UPDATE pg_database SET datallowconn=false WHERE datname='my_db_name'; 
0

開始PostgreSQL的9.5,我們終於可以:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false;