2010-07-06 26 views
15

Ho uno script in PostgreSQL che ripristina il database di test dal dump ogni notte. Il database è accessibile da app server e processi con pool di connessioni che mantiene sempre attive alcune connessioni.PostgreSQL: disabilita temporaneamente le connessioni

Quindi lo script ripristina my_temp_database. Quindi dovrebbe rinominare my_database a my_old_database, my_temp_database a my_database e alla fine rilasciare my_old_database.

Come posso disconnettere tutti i client, superutente o meno, da my_database, in modo che possa essere rinominato? Come posso impedire temporaneamente la riconnessione?

C'è un modo migliore per fare ciò di cui ho bisogno?

risposta

23

Per contrassegnare database come non accettare nuove connessioni 'applogs':

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

Un'altra possibilità sarebbe quella di revocare 'collegare' l'accesso alla banca dati per il ruolo client (s).

Disconnettere utenti dal database = kill backend. Quindi, per scollegare tutti gli altri utenti dal database "applogs", per esempio:

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

volta che hai fatto sia di quelli, sei l'unico utente collegato a 'applogs. Sebbene potrebbe esserci effettivamente un ritardo prima che i backend finiscano effettivamente di disconnettersi?

+0

Ah, vorrei che ha lavorato in 8.3. –

+0

In 8.3 si può provare 'selezionare pg_terminate_backend (pid) da pg_stat_activity;' –

+0

@araqnid Il comando "update pg_database set datallowconn = false dove datname = 'applogs';" funziona come un fascino! "REVOKE CONNECT ON DATABASE" non funziona per me! SU! SU! SU! SU! SU! SU! –

7

Dopo aver terminato le connessioni attive correnti è possibile anche emettere questo comando che consentirà solo ai super utenti di accedere. Questo presuppone che tu stia bene con tutti i super utenti che hanno ancora accesso. Spero che tu non distribuisca i diritti dei super utenti a chiunque.

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

ho avuto un diverso scenario di utilizzo, in cui ho voluto disabilitare un DB per tutti (compresi superuser) e per sempre, ma non chiaramente cadere appena ancora, per essere in grado di riattivare rapidamente, se necessario.

Questo ha funzionato bene su un vecchio 8.3 Postgres:

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

partire PostgreSQL 9.5 finalmente in grado di:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false; 
Problemi correlati