Postgresql |剩余的连接时隙保留用于非复制超级用户连接

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

我在 PostgreSQL 实例之一收到错误“剩余连接槽已保留用于非复制超级用户连接”。

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

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

输出

enter image description here

我搜索了这个错误,每个人都建议增加最大连接数,如下链接所示。 Heroku“psql:致命:剩余连接槽保留用于非复制超级用户连接”

编辑

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

postgresql postgresql-9.6
2个回答
5
投票

就我而言,我正在用 Go 进行编程...并在系统日志中收到此错误消息,并且我的应用程序无法访问数据库,直到我重新启动数据库服务器。我正在一个新的操作系统和更高版本的 postgresql 中构建这个 exec。

就我而言,我发现,简单来说,对于我拨打的每个

rows, err := db.Query()
电话,我并没有执行相应的
rows.Close()
电话!幸运的是,在
psql
中,如果您执行
select * from pg_stat_activity where state='idle';
将显示正在执行的确切查询,其中行未关闭。中间是否有偷偷退出或中断通话的情况?就我而言,有一个简单的解决方案!


2
投票

可能不能直接解决您的问题,但我建议使用像pgbouncer这样的中间件。它有助于保持与数据库服务器的较低且固定数量的打开连接。 您的客户端将连接到 pgbouncer,并且 pgbouncer 将在内部选择其已打开的连接之一用于您的客户端的查询。如果客户端数量超过可能的连接量,客户端将排队直到有一个可用,因此在高流量的情况下允许一些喘息空间,同时使数据库服务器保持在可容忍的负载下。

© www.soinside.com 2019 - 2024. All rights reserved.