我有一个在 Heroku 上运行的应用程序。此应用程序安装了 Postgres 9.2.4 (Dev) 插件。为了访问我的在线数据库,我使用 Navicat Postgres。有时,Navicat 不会完全关闭它与 Postgres 数据库建立的连接。结果是,一段时间后,有 20 多个与 Postgres 数据库的打开连接。我的 Postgres 安装只允许 20 个同时连接。因此,由于有 20 多个打开的连接,我的 Postgress 数据库现在无法访问(连接太多)。
我知道这是 Navicat 的问题,我正在尝试解决这个问题。但如果发生这种情况(连接太多),我该如何解决这个问题(例如关闭所有连接)。
我已经尝试了以下所有方法,但没有结果。
heroku restart
)我认为 Postgres 端显然存在一些“死”连接。但我该如何关闭它们呢?
也许看看
heroku pg:kill
能为您做什么? https://devcenter.heroku.com/articles/managing-heroku-postgres-using-cli#pg-ps-pg-kill-pg-killall
heroku pg:killall
将杀死所有打开的连接,但这可能是满足您需求的钝器。
有趣的是,你实际上可以使用heroku的数据剪辑来终止特定的连接。
要获取详细的连接列表,可以通过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'
1). 首先使用
heroku login
使用正确的 ID 登录 Heroku(如果您有多个帐户)。heroku apps
获取应用程序列表,并复制安装了 PostgreSQL 数据库的应用程序的名称。heroku pg:killall --app appname
终止所有连接。
来自 Heroku 文档(重点是我的):
致命:角色连接太多
致命:角色“[角色名称]”的连接过多 入门级(开发版和基本版)计划会出现这种情况,每个用户的最大连接限制为 20 个。 要解决此错误,请通过停止后台工作程序、减少 dyno 数量或重新启动应用程序来关闭与数据库的一些连接,以防随着时间的推移造成连接泄漏。 可以找到有关处理 Rails 应用程序中连接的讨论在这里。
因为 Heroku 不提供超级用户访问权限,您的选择仅限于上述内容。
重启服务器
heroku restart --app <app_name>
它将关闭所有连接并重新启动。
作为超级用户(例如“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();