PostgreSQL常见错误:sorry, too many clients already

数据库 PostgreSQL
当应用程序连接 PostgreSQL 数据库遇到“FATAL: sorry, too many clients already”错误时,表示数据库连接数已经到达服务器允许的最大值,无法建立新的连接。

当应用程序连接 PostgreSQL 数据库遇到“FATAL: sorry, too many clients already”错误时,表示数据库连接数已经到达服务器允许的最大值,无法建立新的连接。

原因分析

PostgreSQL 允许的最大客户端连接数由配置参数 max_connections ,默认值通常为 100。

SHOW max_connections;

max_connections|
---------------+
100            |

那是不是意味着客户端一定可以创建 100 个并发连接呢?

并不是,因为 PostgreSQL 还有另外两个相关参数:

SHOW superuser_reserved_connections;

superuser_reserved_connections|
------------------------------+
3                             |

superuser_reserved_connections 参数代表了 PostgreSQL 数据库为超级用户保留的连接数,默认值为 3。

也就是说,当客户端连接数到达 max_connections - superuser_reserved_connections 时,只有超级用户才能继续创建新的连接。

SHOW reserved_connections;

reserved_connections|
--------------------+
0                   |

reserved_connections 参数代表了 PostgreSQL 数据库为拥有 pg_use_reserved_connections 角色的用户保留的连接数,默认值为 0。这个参数是 PostgreSQL 16 新增参数。

当可用连接数大于 superuser_reserved_connections 并且小于等于 superuser_reserved_connections + reserved_connections 时,只有超级用户或者拥有 pg_use_reserved_connections 角色的用户才能继续创建新的连接。

总结一下,假设 max_connections 参数设置为 100,superuser_reserved_connections 参数设置为 3,reserved_connections 参数设置为 10。此时,客户端最多可以同时创建 100 个连接;当连接数到达 87 并且小于 97 时,只有超级用户和 pg_use_reserved_connections 角色用户可以继续创建连接;当连接数到达 97 时,只有超级用户可以继续创建连接。

解决方法

我们可以利用数据库为超级用户保留的连接登录数据库,然后查看当前服务器进程情况:

SELECT * FROM pg_stat_activity;

datid|datname |pid  |leader_pid|usesysid|usename |application_name                         |client_addr|client_hostname|client_port|backend_start                |xact_start                   |query_start                  |state_change                 |wait_event_type|wait_event         |state |backend_xid|backend_xmin|query_id|query                                                                                                                                                                                                                                                          |backend_type                |
-----+--------+-----+----------+--------+--------+-----------------------------------------+-----------+---------------+-----------+-----------------------------+-----------------------------+-----------------------------+-----------------------------+---------------+-------------------+------+-----------+------------+--------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+----------------------------+
    5|postgres|19256|          |      10|postgres|DBeaver 24.1.5 - Main <postgres>         |127.0.0.1  |               |      55986|2024-08-28 21:20:25.682 +0800|                             |2024-08-28 21:20:25.795 +0800|2024-08-28 21:20:25.795 +0800|Client         |ClientRead         |idle  |           |            |        |SHOW search_path                                                                                                                                                                                                                                               |client backend              |
    5|postgres|22216|          |      10|postgres|DBeaver 24.1.5 - Metadata <postgres>     |127.0.0.1  |               |      55987|2024-08-28 21:20:25.826 +0800|                             |2024-08-28 22:03:37.376 +0800|2024-08-28 22:03:37.376 +0800|Client         |ClientRead         |idle  |           |            |        |SELECT c.oid,c.*,d.description,pg_catalog.pg_get_expr(c.relpartbound, c.oid) as partition_expr,  pg_catalog.pg_get_partkeydef(c.oid) as partition_key ¶FROM pg_catalog.pg_class c¶LEFT OUTER JOIN pg_catalog.pg_description d ON d.objoid=c.oid AND d.objsubid=|client backend              |
    5|postgres|10736|          |      10|postgres|DBeaver 24.1.5 - SQLEditor <Script-2.sql>|127.0.0.1  |               |      55988|2024-08-28 21:20:26.003 +0800|2024-08-28 22:03:41.802 +0800|2024-08-28 22:03:41.803 +0800|2024-08-28 22:03:41.803 +0800|               |                   |active|           |1032        |        |select  * from pg_stat_activity                                                                                                                                                                                                                                |client backend              |
     |        |20852|          |        |        |                                         |           |               |           |2024-08-24 20:56:59.100 +0800|                             |                             |                             |               |                   |      |           |            |        |                                                                                                                                                                                                                                                               |autovacuum launcher         |
     |        | 9236|          |      10|postgres|                                         |           |               |           |2024-08-28 21:13:57.480 +0800|                             |                             |                             |Activity       |LogicalLauncherMain|      |           |            |        |                                                                                                                                                                                                                                                               |logical replication launcher|
     |        |19468|          |        |        |                                         |           |               |           |2024-08-24 20:56:59.082 +0800|                             |                             |                             |Activity       |WalWriterMain      |      |           |            |        |                                                                                                                                                                                                                                                               |walwriter                   |
     |        | 3524|          |        |        |                                         |           |               |           |2024-08-24 20:56:58.608 +0800|                             |                             |                             |Activity       |CheckpointerMain   |      |           |            |        |                                                                                                                                                                                                                                                               |checkpointer                |
     |        | 8896|          |        |        |                                         |           |               |           |2024-08-24 20:56:58.620 +0800|                             |                             |                             |Activity       |BgwriterHibernate  |      |           |            |        |                                                                                                                                                                                                                                                               |background writer           |

系统视图 pg_stat_activity 显示了所有后端进程的信息,其中 backend_type 字段取值为 client backend 的进程对应客户端连接。通过这个视图可以了解客户端的连接情况。

如果应用程序的确需要更多的数据库连接,可以修改上面介绍的 PostgreSQL 配置参数,这些参数的修改都需要重启服务。

如果应用程序并不需要这么多连接,而是由于代码问题导致连接泄露,例如创建了数据库连接后没有正确地释放,或者数据库连接池配置不当导致打开了过多连接。这种情况就需要调整应用端代码,确保正确管理了数据库连接。

责任编辑:华轩 来源: SQL编程思想
相关推荐

2019-06-18 15:20:01

MySQL连接错误数据库

2023-04-26 00:06:22

服务器死循环报错

2017-01-09 16:35:25

socket函数fd备用

2021-02-09 08:13:51

项目内存TCP

2024-01-07 20:05:33

2023-12-25 14:47:14

2011-01-19 15:52:18

Qmail错误代码

2013-07-04 15:05:14

Android

2022-05-24 14:54:50

漏洞网络攻击

2010-08-27 14:05:40

DIV+CSS

2010-08-24 10:32:34

DIV+CSS

2022-12-13 14:51:26

DevOps数据工具

2011-05-17 09:51:27

Div+CSS

2009-09-27 15:20:19

数据中心管理错误

2020-03-20 15:10:09

Python错误分析代码

2011-03-28 14:59:53

SQL Server

2016-03-19 12:13:36

2010-06-01 16:14:04

2021-06-16 15:04:06

JavaScript内存开发

2021-12-30 21:51:10

JavaScript开发内存
点赞
收藏

51CTO技术栈公众号