Wie kann ich alle Verbindungen zu einer bestimmten Datenbank trennen, ohne den Server zu stoppen?

45

Ich möchte alle Verbindungen (Sitzungen) löschen, die derzeit zu einer bestimmten PostgreSQL-Datenbank geöffnet sind, ohne jedoch den Server neu zu starten oder die Verbindungen zu anderen Datenbanken zu trennen.

Wie kann ich das machen?

Sorin
quelle
Ich habe irgendwo gelesen, dass Sie lowth.com/cutter verwenden könnten , um dies zu erreichen.

Antworten:

22

Hier ist meine Antwort auf eine sehr ähnliche Frage zu StackOverflow.

Abhängig von Ihrer Version von postgresql kann es vorkommen, dass Sie auf einen Fehler stoßen, der dazu führt, dass pg_stat_activityaktive Verbindungen von abgelehnten Benutzern weggelassen werden. Diese Verbindungen werden auch in pgAdminIII nicht angezeigt.

Wenn Sie automatische Tests durchführen (bei denen Sie auch Benutzer erstellen), ist dies möglicherweise ein wahrscheinliches Szenario.

In diesem Fall müssen Sie auf folgende Abfragen zurückgreifen:

 SELECT pg_terminate_backend(pg_stat_activity.procpid) 
 FROM pg_stat_get_activity(NULL::integer) 
 WHERE datid=(SELECT oid from pg_database where datname = 'your_database');
jb.
quelle
8
FEHLER: Fehlender FROM-Klauseleintrag für Tabelle "pg_stat_activity" (psql (9.6.1))
user1767316
4
das funktioniert nicht mehr .... bekomme den obigen fehler ^
geringes
Siehe Antwort unten von Szymon Guz
Dfranc3373
Fehlt in Klausel, funktioniert nicht
Vipul
78

Die folgende Abfrage sollte helfen (vorausgesetzt, die Datenbank heißt 'db'):

select pg_terminate_backend(pid) from pg_stat_activity where datname='db';

pidFrüher hieß das procpid, wenn Sie also eine Version von postgres verwenden, die älter als 9.2 ist, können Sie Folgendes versuchen:

select pg_terminate_backend(procpid) from pg_stat_activity where datname='db';

Sie müssen jedoch ein Superuser sein, um andere Benutzer zu trennen.

Es könnte auch nützlich sein, REVOKE CONNECT ON DATABASE FROM PUBLICoder so ähnlich, und dann GRANTdanach.

Paul White
quelle
3

Dies kann verwendet werden, um eine Datenbank von Client-Verbindungen zu "befreien", so dass Sie sie beispielsweise umbenennen können:

SELECT pg_terminate_backend(procpid) FROM pg_stat_activity WHERE datname='current_db';
ALTER DATABASE current_db RENAME TO old_db;
ALTER DATABASE new_db RENAME TO current_db;

Beachten Sie, dass dies zu einem problematischen Verhalten Ihrer Client-Apps führen kann. Die Daten sollten nicht aufgrund von Transaktionen beschädigt werden.

Trygve Laugstøl
quelle