psql: FATAL: 角色连接过多

21

我尝试使用以下命令连接到数据库服务器:

psql -h host_ip -d db_name -U user_name --password
它显示以下行并拒绝连接。

它显示以下行并拒绝连接。

psql: FATAL:  too many connections for role "user_name".

如何关闭活动连接?
我没有数据库管理员权限,只是普通用户。


4
联系管理员。如果您没有打开其他连接,则必须有权关闭它们。 - Jakub Kania
7个回答

18

从集群中的任何数据库内部:

死循环:首先需要连接到数据库。也许您可以作为另一个用户连接?(默认情况下,一些连接被保留给具有 superuser_reserved_connections 设置的超级用户。)

要获取此用户的每个连接的详细信息:

SELECT *
FROM   pg_stat_activity
WHERE  usename = 'user_name';

作为相同用户或超级用户,您可以取消用户的所有(其他)连接:

SELECT pg_cancel_backend(pid)     -- (SIGINT)
    -- pg_terminate_backend(pid)  -- the less patient alternative (SIGTERM)
FROM   pg_stat_activity
WHERE  usename = 'user_name'
AND    pid <> pg_backend_pid();

一定要确认可以这样做。你不想以那种方式终止重要的查询(或连接)。

在手册中查看 pg_cancel_backend()pg_terminate_backend()

从Linux shell

是自己启动了其他连接吗?也许是你的一个挂起脚本?你应该可以终止它们(如果确定可以这样做)。

您可以使用ps来查找哪些进程可能存在问题:

ps -aux
ps -aux | grep psql

如果您确定要终止一个进程(请确保您不想终止服务器):
kill  123457689 # pid of process here.

或者使用SIGKILL而不是SIGTERM

kill -9 123457689

你不需要已经连接到数据库才能杀死这些进程吗?如果数据库不允许你连接,你怎么能杀死它们呢?或者我错过了什么? - Gruny
@Gruny:要运行SQL命令,您需要连接到数据库。您看到我提到的superuser_reserved_connections了吗?Shell命令可以从外部工作。 - Erwin Brandstetter

9
我对pgAdmin还很陌生,迄今为止我还没有使用过命令行。我遇到了相同的问题,我发现在我的情况下解决这个问题最简单的方法是仅删除“数据库活动”中列出的进程。
(只需单击PID左侧的X)
这有点繁琐,因为您必须逐个删除每个进程,但这样做应该可以释放可用连接。希望这个信息有用。

4
您需要连接到您的PostgreSQL数据库并运行以下命令:
ALTER ROLE your_username CONNECTION LIMIT -1;

2

请检查 pool_size,这可能设置过大或过小,请在本地的 psql 设置中进行调整。您应该首先使用 pool_size = 10(如默认设置)进行检查。这应该可以解决 too_many_connections 的错误。


0
请检查该用户允许多少连接,您可以杀死该用户的其他连接,然后重新登录。但最好是增加该用户的连接限制。
这个问题大多发生在PgAdmin上。似乎经过这么多年后,这个问题仍然存在。

0
我遇到了这个问题,是在Django开发中。我打开了一个shell来查询Django模型,并且也启动了开发服务器。我用elephantsql来进行测试/原型制作。但是它抛出了错误。一旦我退出django manage.py shell,它就可以正常工作了。

0

这将会断开除了你的以外的所有现有连接:

查询pg_stat_activity并获取您想要终止的pid值,然后向它们发出SELECT pg_terminate_backend(pid int)。

适用于PostgreSQL 9.2及以上版本:

SELECT pg_terminate_backend(pg_stat_activity.pid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
  AND pid <> pg_backend_pid();

PostgreSQL 9.1及以下版本:

SELECT pg_terminate_backend(pg_stat_activity.procpid)
FROM pg_stat_activity
WHERE pg_stat_activity.datname = 'TARGET_DB' -- ← change this to your DB
  AND procpid <> pg_backend_pid();

来自https://dev59.com/Mm035IYBdhLWcg3wc_wm#5408501(重复)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接