Wie kann ich die PostgreSQL-Hang-Abfrage beenden/beenden?

So beenden / beenden Sie die PostgreSQL-Hang-Abfrage

Heute habe ich herausgefunden, dass eine der SQL-Abfragen in PostgreSQL hängt und sich nie selbst veröffentlicht. Der Befehl "Abfrage abbrechen" hilft nicht weiter, und die Abfrage hängt nur dort und zeigt den Status "idle in transaction" an. Ich hatte keine andere Wahl, als zum Debian-Terminal zu gehen und den Befehl "kill" auszugeben, um es manuell zu beenden.

Abfragen hängen oder nicht in PostgreSQL antworten, weil wir den Transaktionsmanager in der Webanwendung nicht richtig behandelt haben. Wenn das System versehentlich heruntergefahren wird, hängt die ausgeführte Abfrage in PostgreSQL und der Transaktionsmanager (z. B.DataSourceTransactionManager) schafft es nicht, die laufende Transaktion zurückzusetzen.

Note
Nachdem ich den Transaktionsmanager aufJtaTransactionManager geändert habe, kann meine Webanwendung die laufende Transaktion auch dann beenden, wenn das System versehentlich heruntergefahren wird.

Hier zeige ich Ihnen jedoch, wie Sie die hängende SQL-Abfrage terminieren. In PostgreSQL werden alle hängenden Abfragen als "idle in transaction" angezeigt. Zuerst müssen Sie alle vorhandenen PostgreSQL-Prozesse auflisten und einen Befehl kill terminate ausgeben, um die hängende Abfrage manuell zu beenden.

1. Listen Sie alle Prozesse auf

Geben Sie den Befehl "ps -ef | grep postgres" ein, um alle vorhandenen Prozesse aufzulisten, die dem Benutzer von postgres gehören.

example:~# ps -ef | grep postgres
postgres 13648     1  0 11:04 ?        00:00:00 /var/lib/postgresql/PostgresPlus8.3xxxxxxx
postgres 13651 13648  0 11:04 ?        00:00:00 postgres: logger process
postgres 13653 13648  0 11:04 ?        00:00:00 postgres: writer process
postgres 13654 13648  0 11:04 ?        00:00:00 postgres: wal writer process
postgres 13655 13648  0 11:04 ?        00:00:00 postgres: autovacuum launcher process
postgres 13656 13648  0 11:04 ?        00:00:00 postgres: stats collector process
postgres 13668 13648  0 11:04 ?        00:00:00 postgres: postgres postgres 10.70.1.27(3734) idle
postgres 13689 13648  0 11:05 ?        00:00:00 postgres: usrdba db_test 10.70.1.67(4164) idle
postgres 13714 13648  0 11:06 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57586) idle in transaction
postgres 13721 13648  0 11:06 ?        00:00:16 postgres: usrdba db_test 10.70.1.67(4165) idle
postgres 13832 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57592) idle
postgres 13833 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57593) idle
postgres 13834 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57594) idle
postgres 13835 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57595) idle
postgres 13836 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57596) idle
postgres 14201 13648  0 11:23 ?        00:00:00 postgres: nrsdba postgres 10.70.1.8(4419) idle
postgres 14202 13648  0 11:23 ?        00:00:00 postgres: usrdba db_test 10.70.1.8(4420) idle
postgres 14207 13648  0 11:24 ?        00:00:00 postgres: usrdba db_test 10.70.1.8(4421) idle
root     18030 17992  0 13:46 pts/0    00:00:00 grep postgres
example:~#

2. Finde die Leerlauftransaktion + Kill

Beachten Sie die Prozess-ID „13714, idle in transaction“. Dies ist die hängende Abfrage in PostgreSQL. Setzen Sie den Befehl "kill" ab, um den PostgreSQL-Prozess manuell zu beenden.

example:~# kill 13714

or

example:~# kill -TERM 13714

or

example:~# kill -15 13714

3. Getötet ! Erledigt.

Fertig, die hängende Abfrage ist weg!

example:~# ps -ef | grep postgres
postgres 13648     1  0 11:04 ?        00:00:00 /var/lib/postgresql/PostgresPlus8.3xxxxxxx
postgres 13651 13648  0 11:04 ?        00:00:00 postgres: logger process
postgres 13653 13648  0 11:04 ?        00:00:00 postgres: writer process
postgres 13654 13648  0 11:04 ?        00:00:00 postgres: wal writer process
postgres 13655 13648  0 11:04 ?        00:00:00 postgres: autovacuum launcher process
postgres 13656 13648  0 11:04 ?        00:00:00 postgres: stats collector process
postgres 13668 13648  0 11:04 ?        00:00:00 postgres: postgres postgres 10.70.1.27(3734) idle
postgres 13689 13648  0 11:05 ?        00:00:00 postgres: usrdba db_test 10.70.1.67(4164) idle
postgres 13721 13648  0 11:06 ?        00:00:16 postgres: usrdba db_test 10.70.1.67(4165) idle
postgres 13832 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57592) idle
postgres 13833 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57593) idle
postgres 13834 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57594) idle
postgres 13835 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57595) idle
postgres 13836 13648  0 11:10 ?        00:00:00 postgres: usrdba db_test 10.70.0.61(57596) idle
postgres 14201 13648  0 11:23 ?        00:00:00 postgres: nrsdba postgres 10.70.1.8(4419) idle
postgres 14202 13648  0 11:23 ?        00:00:00 postgres: usrdba db_test 10.70.1.8(4420) idle
postgres 14207 13648  0 11:24 ?        00:00:00 postgres: usrdba db_test 10.70.1.8(4421) idle
root     18030 17992  0 13:46 pts/0    00:00:00 grep postgres
example:~#