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?
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?
Antworten:
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_activity
aktive 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');
Die folgende Abfrage sollte helfen (vorausgesetzt, die Datenbank heißt 'db'):
select pg_terminate_backend(pid) from pg_stat_activity where datname='db';
pid
Frü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 PUBLIC
oder so ähnlich, und dann GRANT
danach.
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.