Mit der Funktion pg_terminate_backend kannst du eine problematische Session beenden.
SELECT pg_terminate_backend(PID);
Lang laufende Abfragen finden
Bevor du eine Session in PostgreSQL beendest, musst du wissen, welche Session betroffen ist. Um lang laufende Abfragen zu finden, kannst du die View pg_stat_activity nutzen und nach den Spalten state und query_start filtern.
SELECT pid, usename, state, query, now() - query_start AS duration
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC;
Erwartete Ausgabe:
| pid | usename | state | query | duration |
|---|---|---|---|---|
| 1236 | appuser | active | UPDATE orders SET status=’paid’; | 00:20:34 |
| 1234 | postgres | active | SELECT * FROM users; | 00:05:12 |
Eine Session beenden
Sobald du die problematische Session gefunden hast, kannst du sie mit der Funktion pg_terminate_backend beenden.
SELECT pg_terminate_backend(1236);
Dieser Befehl beendet die Verbindung zum Backend zwangsweise. Er sendet ein SIGTERM-Signal an den Prozess und lässt ihn sauber beenden, sodass er vorher noch aufräumen kann. Prüfe vor dem Ausführen dieses Befehls genau, welche Abfragen gerade laufen, und berücksichtige die Ausgabe.
Beenden von Sessions automatisieren
In Umgebungen, in denen häufig Probleme mit Sessions auftreten, kannst du das Beenden mit einem Skript automatisieren. Hier ist ein einfaches Beispielskript, das lang laufende Abfragen beendet:
DO $$
DECLARE
r RECORD;
BEGIN
FOR r IN
SELECT pid
FROM pg_stat_activity
WHERE state = 'active'
AND now() - query_start > interval '10 minutes'
LOOP
PERFORM pg_terminate_backend(r.pid);
END LOOP;
END $$;
Dieses Skript beendet jede aktive Session, die länger als 10 Minuten läuft.
Die Funktion pg_cancel_backend verwenden
Manchmal willst du nicht die ganze Session beenden, sondern nur die Abfrage abbrechen, die sie gerade ausführt. Dafür kannst du die Funktion pg_cancel_backend verwenden.
SELECT pg_cancel_backend(PID);
Ersetze PID durch die Prozess-ID der Session mit der Abfrage, die du abbrechen willst.
Dieser Befehl sendet ein SIGINT an den Prozess, um die Abfrage abzubrechen. Das ist weniger brachial als pg_terminate_backend: Die Session selbst bleibt bestehen, nur die laufende Abfrage wird abgebrochen.
Denk daran, dass sowohl pg_cancel_backend als auch pg_terminate_backend Superuser-Rechte voraussetzen. Gehört die Session, die du beenden oder abbrechen willst, einem Superuser, brauchst du Superuser-Rechte, um diese Befehle erfolgreich auszuführen.
Fazit
Jetzt weißt du, wie du Sessions in PostgreSQL beendest. Sessions zu verwalten ist eine wichtige Fähigkeit für Datenbankadministratoren. Wenn du problematische Sessions zuverlässig findest und beendest, kannst du Performance und Zuverlässigkeit deiner PostgreSQL-Datenbanken besser sicherstellen. Setze diese Befehle aber mit Bedacht ein, denn falsch verwendet können sie wichtige Datenverarbeitungsschritte unterbrechen und die Integrität deiner PostgreSQL-Datenbanken gefährden.
Weitere Beiträge, die dir gefallen könnten:
Beekeeper Studio ist eine kostenlose & quelloffene Datenbank-GUI
Das beste SQL-Abfrage- & Editor-Tool, das ich je benutzt habe. Es bietet alles, was ich zum Verwalten meiner Datenbank brauche. - ⭐⭐⭐⭐⭐ Mit
Beekeeper Studio ist schnell, intuitiv und einfach zu bedienen. Beekeeper unterstützt jede Menge Datenbanken und läuft hervorragend auf Windows, Mac und Linux.
Was Nutzer über Beekeeper Studio sagen
„Beekeeper Studio hat meinen alten SQL-Workflow komplett ersetzt. Es ist schnell, intuitiv und macht die Arbeit mit Datenbanken wieder angenehm.“
„Ich habe viele Datenbank-GUIs ausprobiert, aber Beekeeper trifft die perfekte Balance zwischen Funktionsumfang und Einfachheit. Es funktioniert einfach.“