Ceci est une réponse Postgres générale, et non spécifique à heroku
(La réponse simple-stupide à cette question peut être ... il suffit de redémarrer 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 avoir besoin d'être réparée 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) est 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 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 au 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", il suffit:
kill 1234
NE PAS:
kill -9 1234
... Cela entraînera souvent un incendie dans tout le serveur postgres, alors vous pouvez aussi redémarrer postgres. Postgres est assez robuste, donc les données ne seront pas corrompues, mais je recommande de ne pas utiliser "kill -9" dans tous les cas :-)
Un «inactif dans la transaction» de longue durée signifie souvent que la transaction n'a pas été 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. Une «inactivité dans la transaction» de longue durée doit être évitée, car elle peut également entraîner des problèmes de performances majeurs.