Heroku Postgres:连接太多了。我如何杀死这些连接?

时间:2013-11-06 14:30:54

标签: postgresql heroku

我在Heroku上运行了一个应用程序。这个应用程序安装了Postgres 9.2.4(Dev)插件。要访问我的在线数据库,我使用Navicat Postgres。有时Navicat不会干净地关闭它与Postgres数据库建立的连接。结果是,经过一段时间后,Postgres数据库有20多个开放连接。我的Postgres安装只允许20个同时连接。因此,通过20多个开放连接,我的Postgress数据库现在无法访问(连接太多)。

我知道这是Navicat的一个问题,我正在努力解决这个问题。但如果它发生(连接太多),我该如何解决这个问题(例如关闭所有连接)。

我已经尝试了以下所有方法,没有结果。

  • 封闭Navicat&重新启动我的电脑(OS X 10.9)
  • 重新启动了我的Heroku应用程序(heroku restart
  • 尝试重新启动在线数据库,但我发现没有选项可以执行此操作
  • 手动关闭从OS X到Postgres服务器IP的所有连接
  • 重启我们的路由器

我认为Postgres方面显然存在一些'死'联系。但是如何关闭它们?

6 个答案:

答案 0 :(得分:32)

答案 1 :(得分:14)

heroku pg:killall会杀死所有打开的连接,但这可能是一个满足您需求的钝器。 有趣的是,你可以使用heroku的dataclips杀死特定连接

要获得详细的连接列表,您可以通过dataclips查询:

SELECT * FROM pg_stat_activity;

在某些情况下,您可能希望终止与IP地址相关联的所有连接(您的笔记本电脑或我的情况下,现在已销毁的服务器)。

您可以使用以下命令查看每个客户端IP的连接数量:

SELECT client_addr, count(*) 
FROM pg_stat_activity 
WHERE client_addr is not null 
  AND client_addr <> (select client_addr from pg_stat_activity where pid=pg_backend_Tid()) 
GROUP BY client_addr; 

将列出每个IP的连接数,不包括dataclips自身使用的IP。

要实际终止连接,请将其“pid”传递给pg_terminate_backend()。在简单的情况下:

SELECT pg_terminate_backend(1234)

其中1234是您在pg_stat_activity中找到的违规PID。

在我的情况下,我想杀死与(现在死机)服务器相关的所有连接,所以我使用了:

SELECT pg_terminate_backend(pid), host(client_addr) 
FROM pg_stat_activity 
WHERE host(client_addr) = 'IP HERE'

答案 2 :(得分:2)

来自Heroku documentation(强调是我的):

  

致命:角色连接太多

致命:角色“[角色名称]”的连接太多 这发生在Starter Tier(开发和基本)计划上,每个用户的最大连接限制为20。 要解决此错误,请通过停止后台工作程序,减少dynos数量或重新启动应用程序来关闭与数据库的某些连接,以防它随着时间的推移创建连接泄漏。有关处理连接的讨论Rails应用程序可以在这里找到。

因为Heroku does not provide superuser access你的选择相当于上述内容。

答案 3 :(得分:2)

重启服务器

heroku restart --app <app_name>

它将关闭所有连接并重新启动。

答案 4 :(得分:1)

作为超级用户(例如“postgres”),您可以使用如下查询来杀死每个会话但是当前的会话:

select pg_cancel_backend(pid)
from pg_stat_activity
where pid <> pg_backend_pid();

如果它们没有消失,你可能不得不使用更强大的“杀戮”,但肯定先用pg_cancel_backend()进行测试。

select pg_terminate_backend(pid)
from pg_stat_activity
where pid <> pg_backend_pid();

答案 5 :(得分:0)

1)。首先使用heroku login以正确的ID(如果您有多个帐户)登录Heroku。
2)。然后,运行heroku apps以获取您的应用程序列表,并复制已安装PostgreSQL数据库的应用程序的名称。
3)。最后,运行heroku pg:killall --app appname以终止所有连接。