Postgresql | 剩余连接插槽仅保留用于非复制超级用户连接

28

我在一个PostgreSQL实例中遇到了错误 "remaining connection slots are reserved for non-replication superuser connections"。

然而,当我从超级用户运行以下查询以检查可用连接时,我发现有足够的连接。但仍然出现相同的错误。

select max_conn,used,res_for_super,max_conn-used-res_for_super 
res_for_normal 
from 
  (select count(*) used from pg_stat_activity) t1,
  (select setting::int res_for_super from pg_settings where 
name='superuser_reserved_connections') t2,
  (select setting::int max_conn from pg_settings where name='max_connections') t3

输出

输入图像描述

我搜索了这个错误,每个人都建议增加最大连接数,如下链接所示。 Heroku "psql: FATAL: remaining connection slots are reserved for non-replication superuser connections"

编辑

我重新启动了服务器,一段时间后使用的连接几乎达到了210个,但我仍然能够从普通用户连接到服务器。


你能否重现这个问题? - Jonathan Jacobson
同时有多少活动连接?检查传输超时的空闲时间可能会有所帮助。 通常将max_conn设置为100以上是不明智的,最好安装本地池。 - Frank N Stein
2个回答

2

虽然这不是直接解决您问题的方法,但我建议使用中间件,如pgbouncer。它有助于保持较低、固定数量的打开连接到数据库服务器。 您的客户端将连接到pgbouncer,而pgbouncer将在内部选择一个已经打开的连接来用于您客户端的查询。如果客户端数量超过可能的连接数量,则客户端会排队等候,直到有一个可用,因此在高流量情况下留出一些休息时间,同时保持数据库服务器在可承受的负载下。


2
在我的情况下,我正在使用Go编程...并在系统日志中收到了此错误消息,我的应用程序无法访问数据库,直到我重新启动数据库服务器。我是在新的操作系统和后来的postgresql版本中构建这个exec的。
在我的情况下,我发现,简单地说,对于我所做的每个行的err := db.Query()调用,我都没有进行相应的rows.Close()调用!幸运的是,在psql中,如果您执行“select * from pg_stat_activity where state='idle';”将显示正在进行的确切查询,其中未关闭行。有任何隐蔽的退出或中断调用吗?在我的情况下,有一个简单的解决方案!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接