
# 连接DWS数据库时，提示客户端连接数太多
#### 问题现象
连接DWS 数据库时报错，提示客户端连接数太多。
- 使用gsql等SQL客户端工具连接数据库时，出现如下报错信息：
  ```
  FATAL: Already too many clients, active/non-active/reserved: 5/508/3.
  ```
  
- 使用客户端并发连接数据库时，出现如下报错信息：
  ```
  [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的连接释放掉。
   ```
   SELECT PG_TERMINATE_BACKEND(pid) from pg_stat_activity WHERE state='idle';
   ```
   
2. 在DWS控制台设置会话闲置超时时长session_timeout，在闲置会话超过所设定的时间后服务端将主动关闭连接。 session_timeout默认值为600秒，设置为0表示关闭超时限制，一般不建议设置为0。
   session_timeout设置方法如下：
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
   
   2. 在左侧导航栏中，单击"集群 \> 集群列表"。
   
   3. 在集群列表中找到所需要的集群，单击集群名称，进入"集群详情"页面。
   
   4. 单击"参数修改"页签，在"参数列表"中找到"session_timeout"修改其参数值，然后单击"保存"。
   
   5. 在"修改预览"窗口，确认修改无误后，单击"保存"。
    
如果上述方式未能满足业务需求，可继续参考以下方式进行处理：
**当前数据库连接已经超过了最大连接数** **场景处理方式**：
1. 查看CN上的连接来自哪里，总数量以及是否超过当前max_connections（默认值CN节点为800，DN节点为5000）。
   ```
   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。
   1. 登录[DWS控制台](https://console.huaweicloud.com/dws)。
   
   2. 在左侧导航栏中，单击"集群 \> 集群列表"。
   
   3. 在集群列表中找到所需要的集群，单击集群名称，进入"集群详情"页面。
   
   4. 单击"参数修改"页签，在"参数列表"中找到"max_connections"修改其参数值为合适的值，然后单击"保存"。
   
   
   ![](https://support.huaweicloud.com/trouble-dws/figure/zh-cn_image_0000001735392298.png "点击放大")
   
**针对设置了用户最大连接数的场景处理方式：**
在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定，也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。
1. 使用PG_ROLES视图查看指定用户的最大连接数。
   ```
   SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='role1';
    rolname | rolconnlimit
   ---------+--------------
    role1   |           10
   (1 row)
   ```
   
2. 修改用户的最大连接数。
   ```
   ALTER ROLE role1 connection limit 20;
   ```
   
 
