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:~#