Client -> Disconnect erzwingen

Hi, es gibt viele Clients, die auf meine Datenbank zugreifen (nur via. Select). Gibt es eine Möglichkeit einen bestimmten Client zwangsweise zu disconnecten, damit er sich neu einloggen muss?

pg_stat_activity sagt Dir die PID, die Du mit pg_cancel_backend(pid int) töten kannst.

Andreas

Perfekt besten dank!!

mit der Einschränkung, das die Funktion “pg_stat_activity” wohl nur in der UNIX-Version von PostgreSQL ausgeliefert wird. In der Windows-Version von PostgreSQL ist die Funktion nicht vorhanden!




mfg

fristo

Das ist ein VIEW, und ich bin mir recht sicher, das es den auch unter Kleinweich gibt.

Andreas

Ich will hier nur akretschmer bestätigen. Funktioniert auch perfekt unter Windows!

Ich stell mal hier noch eine kleine frage, sonst muss ich einen weitere Thread erstellen.

Ich will den Benutzer-Namen von einer IP bestimmen. Kann ich das generell machen (über der Datenbank-Ebene) oder muss ich das Datenbankspezifisch abfragen.
Zb. Wenn ich vier verschiedene Datenbanken habe, die abfrage 4x durchführen?

okay hat sich erledigt, der view beinhaltet alle datenbanken. d.h. egal, welche datenbank selektiert (connected) ist, es wird alles ausgegeben.

Moin moin,

der Aufruf “SELECT * FROM pg_stat_activity” eignet sich wunderbar innerhalb von psql oder eine Applikation. Ich stehe aber vor dem Problem, dass ich täglich mit einem kleinen Shell Script einen dump wieder einspielen möchte. Dazu lösche ich die DB und erstelle eine neue um dann den dump einzuspielen.

Die DB löschen kann ich allerdings nur, wenn kein anderer darauf zugreift. Ergo suche ich nach einer Möglichkeit herauszufinden, ob es noch Zugriffe auf die DB gibt. Eine Möglichkeit wäre die PID per ps aux | grep postgres rauszubekommen.

Habt Ihr eine andere, bessere Idee? Vielleicht mit Bordmitteln?

Hinweis: ja richtig, die Datenbank löschen ist nicht die feine Art - es handelt sich hier um eine Demo System wo das allerdings völlig in Ordnung geht.

Besten Dank und Grüsse

Andreas

Das geht doch auch aus einem shell-script heraus, wo genau ist Dein Proble?

psql ... -t -c "select count(1) from pg_stat_activity"

Das kannst Du auch in eine Variable packen etc.

Andreas

Kurz vorher könnte man auch den/die Usernamen für die Demo auf “NOLOGIN” setzen und so für die Dauer des Backup/Restore neue Verbindungen verbieten.

Näheres vermittelt die Dokumentation:

ALTER USER

Hallo zusammen,

@Andreas: psql -t ist das Geheimins, denn:

postgres@server:~/daily_overwriting$ psql garfield -c "select procpid from pg_stat_activity"
procpid 
---------
   30578
   30579
   30634
   30823
(4 Zeilen)

aber:

postgres@server:~/daily_overwriting$ psql garfield -t -c "select procpid from pg_stat_activity"
30578
30579
30634
30823

Und das ist das was ich brauche! Cool Danke.

@ads:

Gute Möglichkeit! Werde ich checken.

Und wenn es interessiert, wie man das machen kann ohne die postgreSQL in einem shell script:

ps aux | grep "postgres: pgadmin $DB" | grep -v grep | awk '{print $2}' | while read pid; do kill $pid;done

oder:

pgrep -f 'postgres: pgadmin' | while read pid; do kill $pid; done

oder:

pkill -f 'postgres: pgadmin'

Besten Dank und Grüße

Andreas