文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 数据库连接管理/ 连接GaussDB(DWS)数据库时,提示客户端连接数太多
更新时间:2024-07-01 GMT+08:00

连接GaussDB(DWS)数据库时,提示客户端连接数太多

问题现象

连接GaussDB(DWS) 数据库时报错,提示客户端连接数太多。

  • 使用gsql等SQL客户端工具连接数据库时,出现如下报错信息:
    1
    FATAL: Already too many clients, active/non-active/reserved: 5/508/3.
    
  • 使用客户端并发连接数据库时,出现如下报错信息:
    1
    2
    [2019/12/25 08:30:35] [ERROR] ERROR: pooler: failed to create connections in parallel mode for thread 140530192938752, Error Message: FATAL:  dn_6001_6002: Too many clients already, active/non-active: 468/63.
    FATAL: dn_6001_6002: Too many clients already, active/non-active: 468/63.
    

原因分析

  1. 当前数据库连接已经超过了最大连接数。

    错误信息中,non-active的个数表示空闲连接数,例如,non-active为508,说明当前有大量的空闲连接。

  2. 创建用户时设置了该用户的最大连接数

    查询数据库连接数,如果显示连接数未达设定上限,可能是由于创建用户时设置了该用户的最大连接数。

处理方法

可优先通过如下方法进行应急处理:

  1. 临时将所有non-active的连接释放掉。
    1
    SELECT PG_TERMINATE_BACKEND(pid) from pg_stat_activity WHERE state='idle';
    
  2. 在GaussDB(DWS)控制台设置会话闲置超时时长session_timeout,在闲置会话超过所设定的时间后服务端将主动关闭连接。

    session_timeout默认值为600秒,设置为0表示关闭超时限制,一般不建议设置为0。

    session_timeout设置方法如下:

    1. 登录GaussDB(DWS) 管理控制台。
    2. 在左侧导航栏中,单击“集群管理”
    3. 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。
    4. 单击“参数修改”页签,修改参数“session_timeout”,然后单击“保存”
    5. “修改预览”窗口,确认修改无误后,单击“保存”

如果上述方式未能满足业务需求,可继续参考以下方式进行处理:

当前数据库连接已经超过了最大连接数场景处理方式

  1. 查看CN上的连接来自哪里,总数量以及是否超过当前max_connections(默认值CN节点为800,DN节点为5000)。
    1
    SELECT coorname, client_addr, count(1) FROM pgxc_stat_activity group by coorname, client_addr order by coorname;
    
  2. 判断是否可以调大max_connections,调整策略如下:
    • 调大CN的max_connections会造成并发连接到DN的查询变多,所以需要同步调大DN的max_connections和comm_max_stream。
    • CN/DN的max_connections一般按照原来的2倍调大,原值比较小的集群可以调节到4倍。
    • 为避免在准备步骤失败,max_prepared_transactions的值不能小于max_connections,建议至少将其设置为等于max_connections,这样每个会话都可以有一个等待中的预备事务。
  3. 若上一步中判断可以调整max_connections,则可通过管理控制台调整最大连接数max_connections。

    在管理控制台上,集群“基本信息”页面,单击“参数修改”页签,修改参数“max_connections”为合适的值,然后单击“保存”

针对设置了用户最大连接数的场景处理方式:

在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。

  1. 使用PG_ROLES视图查看指定用户的最大连接数。
    1
    2
    3
    4
    5
    SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='role1';
     rolname | rolconnlimit
    ---------+--------------
     role1   |           10
    (1 row)
    
  2. 修改用户的最大连接数。
    1
    ALTER ROLE role1 connection limit 20;