Was mache ich, wenn pg_cancel_backend nicht funktioniert?

8

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?


quelle

Antworten:

8

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.

mage2k
quelle
8

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 killdirekt oder verwenden pg_ctl kill.

Bribles
quelle
+1 PostgreSQL verwendet einen Prozess pro Verbindung, sodass Sie einen Prozess beenden können, ohne dass die Gefahr besteht, dass andere Verbindungen beeinträchtigt werden. Ich bin mir nicht sicher, ob die Möglichkeit einer Datenbeschädigung besteht, aber ich würde es wirklich bezweifeln.
David Pashley
Ich fand es katastrophal, kill -9 an einen Postgres-Prozess zu senden, da dadurch die Datenbank in den Wiederherstellungsmodus versetzt werden konnte, wodurch sie möglicherweise für viele Minuten außer Betrieb genommen wurde.
1
stackoverflow.com/questions/920956/… Es scheint, dass ich falsch liege .
Bribles
Dieser Link bezieht sich auf das Senden von kill -9 an den Server . Ich spreche von der PID einer einzelnen Abfrage. Oder sind das die gleichen?
2
@Bribles bitte füge eine Warnung zu deinem Beitrag hinzu! SIGQUIT verursacht SCHWERE PROBLEME, wenn es versucht wird. Ich habe es gerade getan und es hat eine Menge Probleme verursacht - ich wünschte, ich könnte in der Zeit zurückgehen und mich davon abhalten, diese Eingabetaste zu drücken!
ADTC
3

Wenn Sie eine aktuelle Postgres haben , können Sie versuchen , pg_terminate_backendstatt.

Vitaly Kushner
quelle
1

bribles ist in seiner obigen Aussage richtig ...

WENN Sie versuchen, auf SHUTDOWNden 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, ActiveAbfragen 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 idlein 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

JayRizzo
quelle