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