# CLEAN CONNECTION
#### 功能描述
清理CN节点到其他指定数据库节点（CN/DN）的网络连接。允许清理CN节点中指定数据库、指定用户的相关空闲/无效连接、强制清理活跃的连接。
#### 注意事项
- 建议仅在数据库出现网络连接异常时执行CLEAN CONNECTION命令，可以通过查询pg_stat_get_pooler_status()函数查看缓存的连接，检验清理的效果。
- 未指定FORCE模式时，存在以下结果：
  - CLEAN CONNECTION操作仅清理数据库节点（CN/DN）之间的连接，不影响客户端连接。
  
  - CLEAN CONNECTION操作仅清理CN中已缓存的空闲/无效的连接，正在使用的正常连接不被清理。
   
- 指定FORCE模式时，存在以下结果：
  - CLEAN CONNECTION操作可同时强制清理正在使用的正常连接以及客户端连接。
  
  - CLEAN CONNECTION操作会清理DN中指定数据库、指定用户的连接。若DN存在无法清理的残留连接，建议运维通过pg_terminate_session函数进行清理该无效会话。
   
 
#### 语法格式
```
CLEAN CONNECTION 
    TO { COORDINATOR ( nodename [, ... ] ) | NODE ( nodename [, ... ] )| ALL [ CHECK ] [ FORCE ] }
    { FOR DATABASE dbname | TO USER username | FOR DATABASE dbname TO USER username };
```
![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/figure/zh-cn_image_0000002764309636.png "点击放大")
#### 参数说明
- **CHECK**
  主要用于DROP DATABASE操作之前的连接访问检查，若发现存在其他会话连接，则报错并终止删除操作。仅当节点列表为TO ALL时可以指定该参数，指定该参数后，会在清理连接前检查数据库是否被其他会话连接访问。
  
- **FORCE**
  清理模式，指定该参数后，当前CN中所有与指定数据库和指定用户相关的线程都将会收到SIGTERM信号，相应的会话被强制关闭、事务会被中止以及网络连接会被清理；DN中所有与指定数据库和指定用户相关的线程都将会收到SIGTERM信号，并且会被强制关闭。
  仅在节点列表指定为TO ALL时可以指定该参数。
  
- **COORDINATOR ( nodename \[, ... \] } ) \| NODE ( nodename \[, ... \] ) \| ALL**
  节点列表，删除CN节点与指定节点的空闲/无效连接。存在以下场景：
  - COORDINATOR**：**删除CN到指定CN节点上的空闲/无效连接。
  
  - NODE**：**删除CN到指定DN节点上的空闲/无效连接。
  
  - ALL**：**删除CN到所有节点上的空闲/无效连接，包括CN和DN。
  
  
  取值范围：已存在的节点名。
  
- **dbname**
  删除当前CN节点中指定数据库相关的连接。如果未指定，则默认删除所有数据库相关的连接。
  取值范围：已存在数据库名称。
  
- **username**
  删除当前CN节点中指定用户相关连接。如果未指定，则默认删除所有用户相关的连接。
  取值范围：已存在的用户。
  
 
#### 示例
```
--创建数据库test_clean_connection。
gaussdb=# CREATE DATABASE test_clean_connection;
--创建jack用户。
gaussdb=# CREATE USER jack PASSWORD '********';
--在另一个会话用jack用户登录该数据库之后，通过视图查询到该连接信息。
gaussdb=# SELECT datname,usename,application_name,waiting,state 
          FROM pg_stat_activity 
          WHERE datname = 'test_clean_connection';
        datname        | usename | application_name | waiting | state 
-----------------------+---------+------------------+---------+-------
 test_clean_connection | jack    | gsql             | f       | idle
(1 row)
--此时直接删除数据库test_clean_connection会有如下报错：
gaussdb=# DROP DATABASE test_clean_connection;
ERROR:  Database "test_clean_connection" is being accessed by other users. You can stop all connections by command: "clean connection to all force for database XXXX;" or wait for the sessions to end by querying view: "pg_stat_activity".
DETAIL:  There is 1 other session using the database.
--删除登录数据库数据库test_clean_connection的当前CN节点与所有节点的连接。
--如果不使用FORCE参数是无法删除stat状态为其他的状态的连接。
gaussdb=# CLEAN CONNECTION TO ALL FORCE FOR DATABASE test_clean_connection;
--查询登录数据库test_clean_connection的连接。
gaussdb=# SELECT datname,usename,application_name,waiting,state
          FROM pg_stat_activity
          WHERE datname = 'test_clean_connection';
 datname | usename | application_name | waiting | state 
---------+---------+------------------+---------+-------
(0 rows)
--删除数据库test_clean_connection。
gaussdb=# DROP DATABASE test_clean_connection;
--删除用户jack。
gaussdb=# DROP USER jack;
```
