Comment tuer/terminer la requête de blocage de PostgreSQL

Comment tuer / terminer la requête bloquée PostgreSQL

Aujourd'hui, j'ai découvert qu'une des requêtes SQL est suspendue dans PostgreSQL et ne se libère jamais. La commande "Annuler la requête" n'aidera pas, et la requête reste juste là et affiche un état "idle in transaction". Cela ne me laissait pas d'autre choix que d'aller sur le terminal Debian pour lancer la commande «kill» pour le terminer manuellement.

La requête suspendue ou ne répondant pas dans PostgreSQL est due au fait que nous n'avons pas géré correctement le gestionnaire de transactions dans l'application Web. Lorsque le système s'arrête accidentellement, l'exécution de la requête se bloque dans PostgreSQL et le gestionnaire de transactions (par exempleDataSourceTransactionManager) ne parvient pas à annuler la transaction en cours.

Note
Après avoir changé le gestionnaire de transactions enJtaTransactionManager, mon application Web est capable de tuer la transaction en cours même lorsque le système est arrêté accidentellement.

Cependant, ici, je vous montre comment terminer la requête SQL bloquée. Dans PostgreSQL, toutes les requêtes en suspens s'afficheront sous la forme «idle in transaction». Tout d'abord, vous devez lister tous les processus PostgreSQL existants et émettre une commande kill terminate pour mettre fin manuellement à la requête suspendue.

1. Répertoriez tous les processus

Exécutez la commande «ps -ef | grep postgres» pour lister tous les processus existants appartenant à l'utilisateur postgres.

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. Trouvez la transaction inactive + Kill

Remarquez l'ID de processus «13714, idle in transaction», c'est la requête en suspens dans PostgreSQL. Exécutez la commande «kill» pour terminer manuellement le processus PostgreSQL.

example:~# kill 13714

or

example:~# kill -TERM 13714

or

example:~# kill -15 13714

3. Tué ! Terminé.

Terminé, la requête en suspens a disparu!

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