7

我从 Play 2.0.3 java 应用程序中收到此错误。如何重新启动 Heroku Postgres Dev DB?我在 Heroku 帮助中心找不到任何重启数据库的说明。

app[web.1]: Caused by: org.postgresql.util.PSQLException: FATAL: remaining connection slots are reserved for non-replication superuser connections
4

3 回答 3

15

您收到的错误消息没有理由重新启动数据库;这不是数据库问题。您的应用程序持有太多连接,可能是因为您忘记设置其连接池。这不是数据库服务器问题,您可以在不重新启动数据库服务器的情况下修复它。

如果您停止 Play 应用程序或重新配置其连接池,问题就会消失。

另一种选择是将您的 Heroku 实例置于维护模式,然后再次将其取出。

由于heroku 不允许您以超级用户身份连接(有充分的理由),因此您不能像使用普通 PostgreSQL 一样使用保留的超级用户插槽来连接和管理连接。

也可以看看:

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

http://wiki.postgresql.org/wiki/Number_Of_Database_Connections

如果您是发现此内容的非 Heroku 用户:

使用普通 PostgreSQL,您可以使用与服务器的 PostgreSQL 连接断开客户端与服务器端的连接。看看它怎么说有一个为“超级用户连接”保留的插槽?使用 PgAdmin-III 或 .作为超级用户(postgres默认为用户)连接到 Pg psql

连接后,您可以看到其他客户端:

SELECT * FROM pg_stat_activity;

如果您想终止除您自己之外的每个连接,您可以运行:

SELECT procpid, pg_terminate_backend(procpid) 
FROM pg_stat_activity WHERE procpid <> pg_backend_pid();

添加AND datname = current_database和/或AND usename = <target-user-name>视情况而定。

于 2012-08-14T11:55:49.780 回答
7

我想我应该在回复之前的答案时添加这个,但我不知道该怎么做,所以......

作为对接受答案线程中 Liron Yahdav 评论的更新:“发现此问题的非 Heroku 用户”解决方案在 Heroku PostgreSQL 开发数据库上为我工作,但对 Liron 提供的查询稍作修改。这是我修改后的查询:SELECT pid, pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND usename='<your_username>';

procpid 似乎已更改为 pid。

于 2013-05-22T16:58:47.717 回答
4

没有办法重新启动整个数据库。不过,heroku 提供了一种简单的方法来停止所有连接,从而解决了大多数情况下的问题:

heroku pg:killall

于 2018-02-25T05:16:55.900 回答