Was soll ich tun, wenn ich eine lange laufende Postgres-Abfrage habe und reguläres "kill [pid]" nicht funktioniert und pg_cancel_backend nicht funktioniert?
Was soll ich tun, wenn ich eine lange laufende Postgres-Abfrage habe und reguläres "kill [pid]" nicht funktioniert und pg_cancel_backend nicht funktioniert?
Antworten:
Sie sollten niemals einen Postgres-Prozess beenden, es sei denn, Ihr Ziel ist es, den gesamten Server gewaltsam herunterzufahren. Sie können jeden Prozess beenden, der nicht auf einen Aufruf von pg_cancel_backend () aus der Shell mit reagiert
kill <pid>
dh nicht -9. Beachten Sie, dass ich einige Male gesehen habe, wo selbst das nicht funktioniert hat, weil der Prozess in einer Schleife auf Daten in einer Netzwerkverbindung gewartet hat. Wenn ich mich richtig erinnere, hat sich das Beenden des Client-Prozesses darum gekümmert.
http://www.postgresql.org/docs/current/static/server-shutdown.html
pg_cancel_backend entspricht dem Senden von SIGINT an den Prozess.
pg_terminate_backend ebenfalls für SIGTERM, aber wenn pg_cancel_backend nicht funktioniert, verstehe ich nicht, warum pg_terminate_backend dies tun würde.
Wenn Sie diese Optionen ausprobiert haben, können Sie SIGQUIT ausprobieren. Die Dokumente sagen: " Dies wird nur in Notfällen empfohlen. "
(Wenn Sie Ihre Daten hassen und hoffen, dass sie sterben, können Sie SIGKILL verwenden. Aber ich würde nicht.)
Sie können entweder kill
direkt oder verwenden pg_ctl kill
.
Wenn Sie eine aktuelle Postgres haben , können Sie versuchen , pg_terminate_backend
statt.
bribles ist in seiner obigen Aussage richtig ...
WENN Sie versuchen, auf SHUTDOWN
den Server, für mich jedoch:
Ich versuche nur, pensionierte Datenbanken / Schemas zu entfernen, die immer noch eine Verbindung haben, die sie nicht loslassen.
Um Ihre Frage zu beantworten,
Wenn ich eine langjährige Postgres-Abfrage habe ...
pg_cancel_backend funktioniert nicht ...
was sollte ich tun?
NICHT IM ZUSAMMENHANG mit dem Herunterfahren des Servers in irgendeiner Weise.
Ich habe auch dieses Verhalten gesehen, pg_cancel_backend()
nicht zu arbeiten. Und wollte meine Arbeitslösung teilen.
Ich habe bisher kein Problem mit einem "Datenverlust" gesehen.
Auch hier versuche ich nicht, Active
Abfragen zu beenden.
- Ich bin als USER "A" mit einer Sitzung oder PID von 777777 angemeldet.
- Und versuchen Sie, eine weitere Sitzung von USER "A" zu trennen, die als 123456789 geöffnet ist
- Welches ist eine schlafende Verbindung, und deshalb suche ich auch
idle
in meinen Fragen unten.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Versuch 1
SELECT pg_cancel_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Interessanterweise gibt das Ergebnis an, dass die Stornierung WAHR ist, aber noch besteht.
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Versuch 2
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- Und jetzt existiert es nicht ..
SELECT *
FROM pg_stat_activity
WHERE pid = 123456789
AND STATE = 'idle';
- HINWEIS: Ich habe versucht, lächerliche PID-Nummern zu verwenden, um zu verhindern, dass Menschen ihr Leben kopieren, einfügen und ruinieren.
- HINWEIS: Standardmäßig können Sie mit postgres NUR Prozesse beenden, die unter IHRER Anmeldung bei USER ausgeführt werden.
- HINWEIS: aber das wussten Sie schon.
Hoffe das hilft. =)
~ Jay