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

我收到运行Heroku Postgres Basic的上述错误消息( 根据此问题 ),并一直在尝试诊断问题。

其中一个建议是使用连接池,但似乎Rails内置了它 。 另一个建议是应用程序配置不正确并打开太多连接。

我的应用程序通过Active Record管理它的所有连接,我从Navicat直接连接到数据库(或者至少我以为我有)。

我该如何调试?

解析度

事实certificate这是一个Heroku问题。 来自Heroku支持:

我们在运行Basic数据库的服务器上检测到了一个问题。 虽然我们查明并解决了这个问题,但我们建议您配置一个新的Basic数据库并使用PGBackups进行迁移,详情请参见https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups 。 这应该将您的数据库放在新服务器上。 我为这次中断道歉 – 我们正在努力解决这个问题并防止它在未来发生。

您可以通过检查视图pg_stat_activity来找到有这么多连接的原因 :

SELECT * FROM pg_stat_activity 

最有可能的是,你有一些杂散循环,可以在不关闭它的情况下打开新连接。

这在我的应用程序上发生了几次 – 不知何故有连接泄漏,然后突然数据库获得的连接数量应该是应有的10倍。 如果您遇到这样的错误,而不是流量,请尝试运行:

 heroku pg:killall 

这将终止与数据库的所有连接。 如果你的情况很危险,可能会切断查询,请小心。 我只有一个rails应用程序,如果它发生故障,丢失一些查询并不是什么大问题,因为浏览器请求将会因为超时而自动完成。

为了节省支持电话,这是我从Heroku支持部门获得的类似问题的回复:

你好,

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

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

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

如果继续,您可以尝试使用heroku插件配置新数据库(在不同的服务器上):添加,然后使用pg:copy移动数据。 请记住,业余爱好等级规则适用于$ 9基本计划以及免费数据库。

谢谢,布拉德利