Heroku“ psql:致命:剩余的连接插槽保留用于非复制超级用户连接”


120

我正在Heroku上使用Postgresql后端开发应用程序。定期地,无论是从CLI还是从服务器上的页面加载中,当尝试访问数据库时,都会收到此错误消息:

psql: FATAL: remaining connection slots are reserved for non-replication superuser connections

有人以前看过这个吗,或者请帮助我指出正确的方向?


1
有同样的问题。我在某处读到Heroku支持在某些服务器上“检测到一些问题”,他们建议相关用户提供新的Basic数据库并使用pgbackups迁移到该数据库。我现在的问题是,应用程序是很新,我并没有创建备份,我也得到了同样的错误尝试创建过程中的一个:d
安德烈·拉斯洛

作为记录,heroku pgbackups尽管出现此错误,我仍然能够使用命令创建备份。
markshiz

要重现此问题,您可以创建大量终端。.bat脚本在Windows此:for /l %%x in (1, 1, 100) do ( start psql )其中,100需要后端的数量。
koxt 2014年

我有同样的问题。我无法使用pg:backups copy,,pg:backups capturepgAdmin我自己的计算机上连接到或通过其他任何我能想象的方式将数据传输到新数据库。甚至pg:killall没有帮助。一个小时后,我再次尝试,并且连接数为50-50,因此经过几次尝试后,我成功了pg:backups copy,我的应用又恢复了正常运转。这是...不好玩的一天。如果用谷歌搜索,请喝一杯水。
奥拉萨拉夫(Aur Saraf)

1
我现在又有这个。记录我以前的经验是多么幸运...编辑:这次重新启动就足够了。
奥拉·萨拉夫

Answers:


56

您要么需要增加max_connections配置设置,要么(可能更好)使用连接池通过较小的连接池路由大量用户请求。

https://wiki.postgresql.org/wiki/Number_Of_Database_Connections


14
同样常见的问题是客户端应用程序崩溃并保持连接打开,然后在重新启动时打开新的连接。如果这种事情经常发生,那么您将耗尽连接。或应用程序配置不正确,并打开了太多连接。
Scott Marlowe 2012年

5
我认为我无法在Heroku上更改配置设置。有没有办法关闭所有打开的连接?
nathancahill 2012年

1
希望服务器在相当积极的基础上配置为保持活动数据包。如果连接突然中断,这将导致会话在合理的时间内终止。如果未配置,则可以以数据库超级用户身份登录,则可以标识pid会话的值并使用该pg_terminate_backend()功能将其杀死。为避免此问题,请确保正确关闭连接,而不要突然终止客户端。
kgrittn

@nathancahill终止与数据库的所有连接:heroku pg:killall
Roko


7

请参见Heroku“ psql:致命:剩余的连接插槽保留用于非复制超级用户连接”

Heroku有时在数据库负载平衡方面存在问题。

André Laszlomarkshiz我都在对此问题的评论中报告了处理此问题的方法。

为了节省您的支持电话,以下是我从Heroku支持获得的关于类似问题的回复:

你好,

爱好层数据库的局限性之一是未经通知的维护。许多爱好数据库都在单个共享服务器上运行,并且出于硬件维护的目的,有时我们需要重新启动该服务器,或者将数据库迁移到另一台服务器以进行负载平衡。发生这种情况时,您会在日志中看到错误或连接有问题。如果服务器正在重新启动,则数据库可能需要15分钟或更长时间才能重新联机。

维护连接池的大多数应用程序(例如Rails中的ActiveRecord)都可以打开与数据库的新连接。但是,在某些情况下,应用将无法重新连接。如果发生这种情况,您可以heroku重新启动应用程序以使其重新联机。

这是我们建议不要针对关键生产应用程序运行业余数据库的原因之一。标准数据库和高级数据库包含停机事件的通知,并且总体上性能和稳定性更高。您可以使用pg:copy迁移到标准计划或高级计划。

如果这种情况仍然存在,您可以尝试使用heroku addons:add设置一个新的数据库(在其他服务器上),然后使用pg:copy移动数据。请记住,业余爱好规则适用于$ 9基本计划以及免费数据库。

谢谢,布拉德利


1
我想知道当您使用每月50美元的数据库计划时,罐头响应是什么?
mpoisot

1
仅爱好层使用共享数据库服务器。使用每月50美元的计划,您将拥有自己的服务器,因此,如果遇到此问题,则由您自己的应用程序创建。每月$ 50的计划提供更多管理选项,因此更易于诊断和修复。
杰萨米·史密斯

您能否解释一下标准选项可以提供哪些管理选项?也仅通过200个连接即可获得此消息。
Pencilcheck

6

我实际上尝试使用以下方法在django端实现连接池:

https://github.com/gmcguire/django-db-pool

但是,尽管将可用的连接数降低到标准的开发数据库配额为20个打开的连接之下,我仍然收到此错误。

这里有一篇有关如何将您的postgresql数据库移动到Amazon RDS的免费/廉价层的文章。这将允许您设置max_connections更高。这也将允许您使用PGBouncer在数据库级别池化连接。

https://www.lewagon.com/blog/how-to-migrate-heroku-postgres-database-to-amazon-rds

更新:

Heroku回应了我的公开票,并说我的数据库在他们的网络中负载平衡不当。他们说,对其系统进行的改进应该可以防止将来出现类似的问题。尽管如此,支持手动重定位了我的数据库,性能得到了明显改善。


我认为移动数据库是完全控制它的最佳解决方案。感谢您的文章。
nathancahill

-3

通过以下命令重新启动您的postgres数据库:

postgres -D /usr/local/var/postgres

Postgres数据库是由Heroku托管的服务,因此将无法使用。
蓬勃发展
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.