it-swarm-eu.dev

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

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

Wie kann ich das machen?

60
sorin

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

Abhängig von Ihrer Version von postgresql kann es zu einem Fehler kommen, der pg_stat_activity, um aktive Verbindungen von abgebrochenen Benutzern wegzulassen. Diese Verbindungen werden auch in pgAdminIII nicht angezeigt.

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

In diesem Fall müssen Sie zu folgenden Abfragen zurückkehren:

 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');
27
jb.

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

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

pid hieß früher 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 PUBLIC oder ähnliches, und danach GRANT.

101
Szymon Guz

Dies kann verwendet werden, um eine Datenbank von Clientverbindungen 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 problematischem Verhalten Ihrer Client-Apps führen kann. Daten sollten aufgrund der Verwendung von Transaktionen nicht beschädigt werden.

3
cysk