2010-07-06 16 views
15

Ich habe ein Skript in PostgreSQL, die Testdatenbank jede Nacht aus Dump wiederherstellt. Auf die Datenbank greifen App-Server und Prozesse mit einem Verbindungspool zu, der zu jeder Zeit einige Verbindungen aufrecht erhält.PostgreSQL: vorübergehend Verbindungen deaktivieren

So stellt das Skript Dump in my_temp_database. Dann sollte es my_database zu my_old_database, my_temp_database zu my_database umbenennen und schließlich my_old_database fallen lassen.

Wie kann ich alle Clients, Superuser oder nicht, von my_database trennen, so dass es umbenannt werden kann? Wie kann ich vorübergehend verhindern, dass sie sich wieder verbinden?

Gibt es einen besseren Weg, um das zu tun, was ich brauche?

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

andere Möglichkeit wäre, zu widerrufen ‚verbinden‘ Zugriff auf die Datenbank für die Client-Rolle (n):

Antwort

23

Um Datenbank ‚applogs‘ nicht die Annahme neuer Verbindungen zu markieren.

Trennen Sie Benutzer von der Datenbank = Kill Backend. Also alle anderen Benutzer trennen von „applogs“ Datenbank, zum Beispiel:

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

Sobald Sie diese beiden getan haben, sind Sie der einzige Benutzer mit ‚applogs‘. Obwohl es tatsächlich eine Verzögerung geben könnte, bevor die Backends tatsächlich die Verbindung trennen?

+0

Ha, ich wünsche es in 8.3 gearbeitet. –

+0

In 8.3 können Sie versuchen, 'pg_terminate_backend (pid) von pg_stat_activity zu wählen;' –

+0

@araqnid Der Befehl "update pg_database set datallowconn = false where datname = 'applogs';" klappt wunderbar! "REVOKE CONNECT ON DATABASE" funktioniert nicht für mich! OBEN! OBEN! OBEN! OBEN! OBEN! OBEN! –

7

Nachdem Sie die aktuellen aktiven Verbindungen beendet haben, können Sie auch diesen Befehl ausführen, der nur Superbenutzern die Anmeldung ermöglicht. Dies setzt voraus, dass Sie mit allen Superbenutzern einverstanden sind, die noch Zugang haben. Hoffentlich verschenken Sie keine Super User-Rechte an irgendjemanden.

ALTER DATABASE your_db CONNECTION LIMIT 0; 
0

hatte ich ein anderes Nutzungsszenario, in dem ich eine DB für jeden (auch Superuser) und für immer, aber nicht deutlich falle nur noch, deaktivieren wollte es schnell in der Lage sein zu reaktivieren, wenn nötig.

Das funktionierte auf einem alten 8.3 Postgres fein:

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

Ab PostgreSQL 9.5 können wir endlich:

ALTER DATABASE db WITH ALLOW_CONNECTIONS false; 
Verwandte Themen