我在Heroku上运行了一个应用程序。这个应用程序安装了Postgres 9.2.4(Dev)插件。要访问我的在线数据库,我使用Navicat Postgres。有时Navicat不会干净地关闭它与Postgres数据库建立的连接。结果是,经过一段时间后,Postgres数据库有20多个开放连接。我的Postgres安装只允许20个同时连接。因此,通过20多个开放连接,我的Postgress数据库现在无法访问(连接太多)。
我知道这是Navicat的一个问题,我正在努力解决这个问题。但如果它发生(连接太多),我该如何解决这个问题(例如关闭所有连接)。
我已经尝试了以下所有方法,没有结果。
heroku restart
)我认为Postgres方面显然存在一些'死'联系。但是如何关闭它们?
答案 0 :(得分:32)
也许看看heroku pg:kill
能为你做些什么? https://devcenter.heroku.com/articles/heroku-postgresql#pg-ps-pg-kill-pg-killall
答案 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
以终止所有连接。