Ceci est une réponse Postgres générale, et non spécifique à heroku
(La réponse simple et stupide à cette question peut être ... redémarrez simplement postgresql. En supposant que ce n'est pas souhaitable ou pas une option ...)
Trouvez le PID en exécutant ce sql :
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(La requête peut nécessiter une correction en fonction de la version de postgres - éventuellement, sélectionnez simplement * dans pg_stat_activity). Vous trouverez le pid dans la première colonne (à gauche) et la première ligne (en haut) sera probablement la requête que vous souhaitez terminer. Je suppose que le pid est 1234 ci-dessous.
Vous pouvez annuler une requête via SQL (c'est-à-dire sans accès au shell) tant qu'elle vous appartient ou que vous disposez d'un accès super utilisateur :
select pg_cancel_backend(1234);
C'est une demande "amicale" pour annuler la requête 1234, et avec un peu de chance, elle disparaîtra après un certain temps. Finalement, c'est plus efficace :
select pg_terminate_backend(1234);
Si vous avez un accès shell et des autorisations root ou postgres, vous pouvez également le faire depuis le shell. Pour "annuler", on peut faire :
kill -INT 1234
et pour "terminer", simplement :
kill 1234
NE PAS :
kill -9 1234
... cela entraînera souvent l'effondrement de tout le serveur postgres, alors vous pouvez aussi bien redémarrer postgres. Postgres est assez robuste, donc les données ne seront pas corrompues, mais je déconseille d'utiliser "kill -9" dans tous les cas :-)
Un "inactif dans la transaction" de longue durée signifie souvent que la transaction ne s'est pas terminée par un "commit" ou un "rollback", ce qui signifie que l'application est boguée ou n'est pas correctement conçue pour fonctionner avec des bases de données transactionnelles. Les "inactivité en cours de transaction" de longue durée doivent être évitées, car elles peuvent également entraîner des problèmes de performances majeurs.