Heroku Postgres:连接太多。我如何终止这些连接?

问题描述 投票:0回答:6

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

我知道这是 Navicat 的问题,我正在尝试解决这个问题。但如果发生这种情况(连接太多),我该如何解决这个问题(例如关闭所有连接)。

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

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

我认为 Postgres 端显然存在一些“死”连接。但我该如何关闭它们呢?

postgresql heroku
6个回答

27
投票

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'

12
投票

1). 首先使用

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


9
投票

来自 Heroku 文档(重点是我的):

致命:角色连接太多

致命:角色“[角色名称]”的连接过多 入门级(开发版和基本版)计划会出现这种情况,每个用户的最大连接限制为 20 个。 要解决此错误,请通过停止后台工作程序、减少 dyno 数量或重新启动应用程序来关闭与数据库的一些连接,以防随着时间的推移造成连接泄漏。 可以找到有关处理 Rails 应用程序中连接的讨论在这里。

因为 Heroku 不提供超级用户访问权限,您的选择仅限于上述内容。


7
投票

重启服务器

heroku restart --app <app_name>

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


2
投票

作为超级用户(例如“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();
© www.soinside.com 2019 - 2024. All rights reserved.