我收到了运行Heroku Postgres Basic(as per this question)的上述错误消息,并且一直在尝试诊断问题。
其中一个建议是使用连接池,但似乎Rails has this built in。另一个建议是应用程序配置不正确并打开太多连接。
我的应用程序通过Active Record管理它的所有连接,我从Navicat直接连接到数据库(或者至少我以为我有)。
我该如何调试?
解决
原来这是一个Heroku问题。来自Heroku的支持:
我们在运行Basic数据库的服务器上检测到一个问题。 虽然我们会查明并解决这个问题,但我们会向您推荐 提供一个新的Basic数据库并使用PGBackups迁移 详细说明: https://devcenter.heroku.com/articles/upgrade-heroku-postgres-with-pgbackups 。这应该将您的数据库放在新服务器上。我为此道歉 中断 - 我们正在努力解决这个问题并阻止它 发生在将来。
答案 0 :(得分:14)
这在我的应用程序上发生了几次 - 不知何故有连接泄漏,然后突然数据库获得的连接数量应该是应有的10倍。如果您遇到这样的错误而不是流量,请尝试运行:
heroku pg:killall
这将终止与数据库的所有连接。如果您的情况很危险,可能会切断查询,请小心。我只有一个rails应用程序,如果它出现故障,丢失一些查询并不是什么大问题,因为浏览器请求自从超时以后就会有所不同。
答案 1 :(得分:9)
您可以通过检查查看pg_stat_activity:
来找到有这么多连接的原因SELECT * FROM pg_stat_activity
最有可能的是,你有一些杂散循环,可以在不关闭它的情况下打开新连接。
答案 2 :(得分:4)
为了节省支持电话,以下是Heroku支持部门针对类似问题的回复:
您好,
业余爱好层数据库的一个限制是未经宣布的维护。许多业余爱好数据库在单个共享服务器上运行,我们偶尔需要重新启动该服务器以进行硬件维护,或者将数据库迁移到另一台服务器以实现负载平衡。发生这种情况时,您会在日志中看到错误或连接时出现问题。如果服务器正在重新启动,则数据库重新联机可能需要15分钟或更长时间。
维护连接池的大多数应用程序(如Rails中的ActiveRecord)只能打开与数据库的新连接。但是,在某些情况下,应用程序将无法重新连接。如果发生这种情况,您可以重新启动应用程序以使其重新联机。
这是我们建议不要为关键生产应用程序运行业余爱好数据库的原因之一。标准版和高级版数据库包括停机事件的通知,并且通常具有更高的性能和稳定性。您可以使用pg:copy迁移到标准或高级计划。
如果继续,您可以尝试使用heroku插件配置新数据库(在不同的服务器上):添加,然后使用pg:copy移动数据。请记住,业余爱好等级规则适用于$ 9基本计划以及免费数据库。
谢谢, 布拉德利