这是一个关于PostgreSQL的通用回答,与Heroku无关。
(对于这个问题的简单愚蠢的答案可能是...只需重新启动PostgreSQL!假设这不是可取的或不是一个选项...)
通过运行以下SQL语句找到PID:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(根据Postgres的版本,查询可能需要修复 - 最终,只需选择* from pg_stat_activity)。您将在第一列(左侧)找到pid,并且第一行(顶部)很可能是您想要终止的查询。我假设下面的pid是1234。
只要查询是您自己的或您具有超级用户访问权限,您可以通过SQL(即无需shell访问)取消查询:
select pg_cancel_backend(1234);
这是一个“友好”的请求,取消1234查询,希望它会在一段时间后消失。如果需要,以下是一个更加“强制终止”的命令,可以更快地取消它:
select pg_terminate_backend(1234);
如果您具有shell访问权限和root或postgres权限,您也可以通过shell来执行此操作。要“取消”,可以执行以下操作:
kill -INT 1234
而要“终止”,只需简单地:
kill 1234
请勿:
kill -9 1234
...这样经常会导致整个Postgres服务器崩溃,那么最好重启Postgres。Postgres非常强大,所以数据不会损坏,但无论如何,我建议不要使用"kill -9"命令 :-)
长时间的“事务空闲”通常意味着事务没有通过“提交”或“回滚”终止,这意味着应用程序存在错误或者没有正确设计以适应事务性数据库的工作方式。应该避免长时间的“事务空闲”,因为它可能会(根据您的使用模式)导致严重的性能问题。