Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”
Posted
技术标签:
【中文标题】Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”【英文标题】:Heroku "psql: FATAL: remaining connection slots are reserved for non-replication superuser connections" 【发布时间】:2012-08-04 12:54:02 【问题描述】:我正在使用 Postgresql 后端在 Heroku 上开发应用程序。在尝试从 CLI 和在服务器上加载页面时,我会定期收到此错误消息:
psql: FATAL: remaining connection slots are reserved for non-replication superuser connections
有人以前见过这个吗,或者请帮我指出正确的方向?
【问题讨论】:
遇到同样的问题。我在某处读到 Heroku 支持在某些服务器上“检测到了一些问题”,他们建议有问题的用户配置一个新的 Basic 数据库并使用 pgbackups 迁移到它。我现在的问题是该应用程序太新了,以至于我还没有创建备份,而且我在尝试创建一个时遇到了同样的错误:D 作为记录,尽管出现此错误,我还是能够使用heroku pgbackups
命令创建备份。
要重现此问题,您可以创建大量终端。 .bat
Windows 中的脚本:for /l %%x in (1, 1, 100) do ( start psql )
其中 100 是所需的后端数量。
我遇到了同样的问题。我无法使用pg:backups copy
、pg:backups capture
、通过在我自己的计算机上从pgAdmin
连接到它,或者我能想象的任何其他方式将数据传输到新数据库。即使pg:killall
也无济于事。一小时后,我再次尝试,连接数为 50-50,因此经过几次尝试,我成功获得了 pg:backups copy
,并且我的应用程序重新启动。这……不是一个有趣的日子。如果您在 Google 上搜索过,请喝一杯水。
我现在又遇到了。多么幸运地记录了我以前的经历......编辑:这次重新启动就足够了。
【参考方案1】:
您要么需要增加max_connections
配置设置,要么(可能更好)use connection pooling 以通过较小的连接池路由大量用户请求。
https://wiki.postgresql.org/wiki/Number_Of_Database_Connections
【讨论】:
另外一个常见问题是客户端应用程序崩溃并保持连接打开,然后在重新启动时打开新连接。如果这种事情经常发生,那么您将用完连接。或者应用只是配置不当,打开的连接太多。 我认为我无法更改 Heroku 上的配置设置。有没有办法关闭所有打开的连接? 希望服务器在相当激进的基础上配置为保持活动数据包。如果连接突然中断,这将导致会话在合理的时间内终止。如果没有配置,如果您可以作为数据库超级用户登录,您可以识别会话的pid
值并使用pg_terminate_backend()
函数来杀死它们。为避免此问题,请务必正确关闭连接,而不是突然关闭客户端。
@nathancahill 终止与数据库的所有连接:heroku pg:killall
【参考方案2】:
当我忘记关闭连接时发生此异常
【讨论】:
【参考方案3】:见Heroku “psql: FATAL: remaining connection slots are reserved for non-replication superuser connections”:
Heroku 有时会出现数据库负载平衡问题。
André Laszlo
、markshiz
和我都报告说在 cmets 中处理过这个问题。
为了节省您的支持电话,以下是我从 Heroku 支持部门收到的针对类似问题的回复:
你好,
爱好层数据库的限制之一是突击维护。许多爱好数据库在单个共享服务器上运行,我们偶尔需要重新启动该服务器以进行硬件维护,或者将数据库迁移到另一台服务器以进行负载平衡。发生这种情况时,您会在日志中看到错误或连接出现问题。如果服务器正在重新启动,则数据库可能需要 15 分钟或更长时间才能重新联机。
大多数维护连接池的应用程序(如 Rails 中的 ActiveRecord)都可以打开与数据库的新连接。但是,在某些情况下,应用程序将无法重新连接。如果发生这种情况,您可以 heroku 重新启动您的应用程序以使其重新联机。
这是我们建议不要为关键生产应用程序运行爱好数据库的原因之一。标准和高级数据库包括停机事件通知,并且总体上性能更高且更稳定。您可以使用 pg:copy 迁移到标准或高级计划。
如果这种情况继续,您可以尝试使用 heroku addons:add 配置一个新数据库(在不同的服务器上),然后使用 pg:copy 移动数据。请记住,爱好等级规则适用于 9 美元的基本计划以及免费数据库。
谢谢, 布拉德利
【讨论】:
我想知道当您使用每月 50 美元的数据库计划时,预设响应是什么? 只有爱好层使用共享数据库服务器。使用每月 50 美元的计划,您将拥有自己的服务器,因此,如果您遇到此问题,则由您自己的应用程序创建它。每月 50 美元的计划为您提供更多管理选项,因此更容易诊断和修复。 您能解释一下标准选项可以提供哪些管理选项吗?只有 200 个连接时也会收到此消息。【参考方案4】:我实际上尝试使用以下方法在 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 回复了我的未解决问题,并表示我的数据库在他们的网络中的负载平衡不正确。他们说,改进他们的系统应该可以防止将来出现类似的问题。尽管如此,支持手动重定位我的数据库并且性能显着提高。
【讨论】:
我认为移动数据库是完全控制它的最佳解决方案。感谢那篇文章。【参考方案5】:在 Linux 中重现同样的问题:
for i in 1..300; do
PGPASSWORD=MY_PASSWORD gnome-terminal -e $'/usr/bin/psql -h \'127.0.0.1\' -p 5432 -U MY_USERNAME'
done
在 dotnet 客户端中,您可以阅读:
System.InvalidOperationException: An exception has been raised that is likely due to a transient failure. ---> Npgsql.PostgresException (0x80004005): 53300: sorry, too many clients already
【讨论】:
【参考方案6】:我有很多空闲连接,所以我必须在创建新连接之前重用空闲连接,
【讨论】:
【参考方案7】:错误消息表示应用已用完所有可用连接。
在aws中使用带有knex和typescript的postgres来做一些查询和更新工作时,当它完成390个数据库操作时会弹出问题,一个错误会阻止正常的knex.destroy()操作。错误信息是:
(node:66236) UnhandledPromiseRejectionWarning: 错误:剩余的连接槽是为非复制超级用户连接保留的
当 knex.destroy() 转到正确的位置时,错误就消失了。
【讨论】:
以上是关于Heroku “psql: FATAL: 剩余的连接槽是为非复制超级用户连接保留的”的主要内容,如果未能解决你的问题,请参考以下文章
heroku create ENOTFOUND: getaddrinfo ENOTFOUND api.heroku.com api.heroku.com:443
Heroku:“heroku ps:exec”和“heroku run bash”有啥区别?
如何将heroku cedar-14堆栈应用程序升级到最新的heroku堆栈(即,升级到heroku 18)
heroku 在构建脚本中失败,但 heroku 本地网络很好