这是 PostgreSQL 的一般答案,并非特定于 Heroku
(这个问题的简单愚蠢的答案可能是......只需重新启动postgresql!假设这不是可取的或不是一个选项......)
通过运行以下 SQL 查找 PID:
SELECT pid , query, * from pg_stat_activity
WHERE state != 'idle' ORDER BY xact_start;
(查询可能需要根据 postgres 的版本进行修改 - 最终,只需从 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
DO NOT:
kill -9 1234
...这通常会导致整个 postgres 服务器着火,那么你不妨重新启动 postgres。 Postgres 非常强大,因此数据不会被损坏,但我建议在任何情况下都不要使用“kill -9”:-)
持久的“事务空闲”通常意味着事务没有通过“提交”或“回滚”终止,这意味着应用程序有错误或设计不正确,无法与事务数据库一起使用。应避免长期的“事务空闲”,因为它可能(取决于您的使用模式)导致重大性能问题。