# FAQ
#### 连接性能问题
- 问题：开启log_hostname，但是配置错误的DNS导致的连接性能问题。 解决：
  连接数据库，通过"show log_hostname"语句，检查数据库中是否开启log_hostname参数。
  如果开启了相关参数，数据库内核通过DNS反查客户端所在机器的主机名。如果数据库CN所在的主机配置了不正确的/不可达的DNS服务器，会导致数据库建立连接过程较慢。此参数的更多信息详见GUC参数log_hostname。
  
- 问题：数据库内核执行初始化语句较慢导致的性能问题。 解决：
  此种情况定位较难，可以尝试使用Linux命令strace。
  ```
  strace gsql -U MyUserName -d gaussdb -h 127.0.0.1 -p 23508 -r -c '\q'
  Password for MyUserName：
  ```
  在屏幕上打印出数据库的连接过程。比如，如果较长时间停留在下面的操作上，便可以确定是数据库执行"SELECT VERSION()"语句较慢。
  ```
  sendto(3, "Q\0\0\0\25SELECT VERSION()\0", 22, MSG_NOSIGNAL, NULL, 0) = 22
  poll([{fd=3, events=POLLIN|POLLERR}], 1, -1) = 1 ([{fd=3, revents=POLLIN}])
  ```
  在连接数据库后，便可以通过执行"explain performance select version()"语句来确定初始化语句执行较慢的原因。更多信息，详见《SQL调优指南》中" SQL执行计划介绍"章节。
  另外还有一种场景不太常见：由于数据库CN所在机器的磁盘满或故障，此时查询等受影响，无法进行用户认证，导致连接过程挂起。解决此问题的方法是清理数据库CN的数据盘空间。
  
- 问题：TCP连接创建较慢问题。 解决：
  此问题可以参考上面的初始化语句较慢问题的排查方法，通过strace侦听，如果长时间停留在：
  ```
  connect(3, {sa_family=AF_FILE, path="/home/test/tmp/gaussdb_llt1/.s.PGSQL.61052"}, 110) = 0
  ```
  或者
  ```
  connect(3, {sa_family=AF_INET, sin_port=htons(61052), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress)
  ```
  说明客户端与数据库端建立物理连接过慢，此时应当检查网络是否存在不稳定、吞吐量太大的问题。
  
- 问题：资源负载满导致连接较慢的问题。 解决：
  当CPU、内存、I/O负载中的任意一项接近100%时，会出现gsql连接慢的现象。
  - 通过top命令等确认CPU使用率；通过free命令确认内存使用情况；通过iostat命令确认I/O负载；还可以通过cm_agent中的监控日志，以及数据库运维平台中的监测记录进行检查。
  
  - 针对短时间内大量慢查询导致的峰值负载场景，可通过（数据库服务器的端口号+1）端口连接，查询pg_stat_activity视图；针对慢查询，可以使用系统函数pg_terminate_backend进行查杀会话。
  
  - 针对业务量长期超负载情况（即无明显慢查询，或慢查询查杀后但新的查询依然会变成慢查询），应考虑降低业务负载、增加数据库资源的方式进行优化。
   
 
#### 创建连接故障
- 问题：gsql: could not connect to server: No route to host 解决：
  此问题一般是因为指定了不可达的地址或者端口。请检查-h参数与-p参数是否添加正确。
  
- 问题：gsql: FATAL: Invalid username/password,login denied. 解决：
  此问题一般是因为输入了错误的用户名和密码，请联系数据库管理员，确认用户名和密码的正确性。
  
- 问题：gsql: FATAL: Forbid remote connection with trust method! 解决：
  由于安全问题，数据库禁止远程登录时使用trust模式。这时需要修改gs_hba.conf里的连接认证信息。请联系管理员处理。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  请不要修改gs_hba.conf中数据库集群主机的相关设置，否则可能导致数据库功能故障。建议业务应用部署在数据库集群之外，而非集群内部。
  
- 问题：在CN所在的主机连接数据库，添加"-h 127.0.0.1"可以连接，去掉后无法连接。 解决：
  通过执行SQL语句"show unix_socket_directory"检查数据库CN使用的Unix套接字目录，是否与shell中的环境变量$PGHOST一致。如果检查结果不一致，那么修改PGHOST环境变量到GUC参数unix_socket_directory指向的目录。
  关于unix_socket_directory的更多信息，请联系管理员获取。
  
- 问题：The "libpq.so" loaded mismatch the version of gsql, please check it. 解决：
  此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的，请通过"ldd gsql"命令确认当前加载的libpq.so的版本，并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。
  
- 问题：gsql: symbol lookup error: xxx/gsql: undefined symbol: libpqVersionString 解决：
  此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的（也有可能是环境中存在PG的libpq.so），请通过"ldd gsql"命令确认当前加载的libpq.so的版本，并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。
  
- 问题：gsql: connect to server failed: Connection timed out Is the server running on host "xx.xxx.xxx.xxx" and accepting TCP/IP connections on port xxxx?
  解决：
  此问题是由于网络连接故障。请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端，则说明网络连接出现故障。请联系网络管理人员排查解决。
  ```
  ping -c 4 10.10.10.1
  PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.
  From 10.10.10.1: icmp_seq=2 Destination Host Unreachable
  From 10.10.10.1 icmp_seq=2 Destination Host Unreachable
  From 10.10.10.1 icmp_seq=3 Destination Host Unreachable
  From 10.10.10.1 icmp_seq=4 Destination Host Unreachable
  --- 10.10.10.1 ping statistics ---
  4 packets transmitted, 0 received, +4 errors, 100% packet loss, time 2999ms
  ```
  
- 问题：gsql: FATAL: permission denied for database "gaussdb" DETAIL: User does not have CONNECT privilege.
  解决：
  此问题是由于用户不具备访问该数据库的权限，可以使用如下方法解决。
  1. 使用管理员用户连接数据库。
     ```
     gsql -d gaussdb -U dbadmin -p 8000
     ```
     
  
  2. 赋予该用户访问数据库的权限。
     ```
     GRANT CONNECT ON DATABASE gaussdb TO user1;
     ```
     
  
  
  另外，许多常见的错误操作也可能导致用户无法连接到数据库。如用户连接的数据库不存在，用户名或密码输入错误等。这些错误操作在客户端工具会有相应的提示信息。
  ```
  gsql -d gaussdb -p 8000
  gsql: FATAL:  database "gaussdb" does not exist
  gsql -d gaussdb -U user1 -p 8000
  Password for user user1:
  gsql: FATAL:  Invalid username/password,login denied.
  ```
  
- 问题：gsql: FATAL: sorry, too many clients already，active/non-active: 197/3. 解决：
  此问题是由于系统连接数量超过了最大连接数量。请联系数据库DBA进行会话连接数管理，释放无用会话。
  关于查看用户会话连接数的方法如[表1]。
  会话状态可以在视图PG_STAT_ACTIVITY中查看。无用会话可以使用函数pg_terminate_backend进行释放。
  ```
  SELECT datid,pid,state FROM pg_stat_activity;
   datid |       pid       | state  
  -------+-----------------+--------
   13205 | 139834762094352 | active
   13205 | 139834759993104 | idle
  (2 rows)
  ```
  其中pid的值即为该会话的线程ID。根据线程ID结束会话。
  ```
  SELECT PG_TERMINATE_BACKEND(139834759993104);
  ```
  显示类似如下信息，表示结束会话成功。
  ```
  PG_TERMINATE_BACKEND
  ----------------------
   t
  (1 row)
  ```
  
 表1查看会话连接数 
| 描述                   | 命令                                                                                                                                                                                                                                    |
|:---|:---|
| 查看指定用户的会话连接数上限。      | 执行如下命令查看连接到指定用户user1的会话连接数上限。其中-1表示没有对用户user1设置连接数的限制。 ``` gaussdb=# SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='user1'; rolname | rolconnlimit ---------+-------------- user1    |           -1 (1 row) ```               |
| 查看指定用户已使用的会话连接数。     | 执行如下命令查看指定用户user1已使用的会话连接数。其中，1表示user1已使用的会话连接数。 ``` gaussdb=# SELECT COUNT(*) FROM dv_sessions WHERE USERNAME='user1'; count ------- 1 (1 row) ```                                                                                    |
| 查看指定数据库的会话连接数上限。    | 执行如下命令查看连接到指定数据库gaussdb的会话连接数上限。其中-1表示没有对数据库gaussdb设置连接数的限制。 ``` gaussdb=# SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='gaussdb'; datname  | datconnlimit ----------+-------------- gaussdb |           -1 (1 row) ``` |
| 查看指定数据库已使用的会话连接数。 | 执行如下命令查看指定数据库gaussdb上已使用的会话连接数。其中，1表示数据库gaussdb上已使用的会话连接数。 ``` gaussdb=# SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='gaussdb'; count ------- 1 (1 row) ```                                                                    |
| 查看所有用户已使用会话连接数。     | 执行如下命令查看所有用户已使用的会话连接数。 ``` gaussdb=# SELECT COUNT(*) FROM dv_sessions; count ------- 10 (1 row) ```                                                                                                                                    |
   
- 问题：gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired 解决：
  gsql在向数据库发起连接的时候，会有5分钟超时机制，如果在这个超时时间内，数据库未能正常的对客户端请求进行校验和身份认证，那么gsql会退出当前会话的连接过程，并报出该错误。
  一般来说，此问题是由于连接时使用的-h参数及-p参数指定的连接主机及端口有误（即错误信息中的xxx部分），导致通信故障；极少数情况是网络故障导致。要排除此问题，请检查数据库的主机名及端口是否正确。
  
- 问题：gsql: could not receive data from server: Connection reset by peer. 解决：
  请检查CN日志中的如下类似日志" FATAL: cipher file "/data/coordinator/server.key.cipher" has group or world access"，一般是由于数据目录或部分关键文件的权限被误操作篡改导致。请参照其他正常实例下的相关文件权限修改。
  
- 问题：gsql: FATAL: GSS authentication method is not allowed because XXXX user password is not disabled. 解决：
  表示目标CN的gs_hba.conf里，配置了当前客户端IP使用"gss"方式来做认证，该认证算法不支持用作客户端的身份认证，请修改到"sha256"后再试。具体操作请联系管理员处理。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  - 请不要修改gs_hba.conf中数据库集群主机的相关设置，否则可能导致数据库功能故障。
  
  - 建议业务应用部署在数据库集群之外，而非集群内部。
    
 
#### 其他故障
- 问题：出现因"总线错误"（Bus error）导致的core dump或异常退出。 解决：
  一般情况下出现此种问题，是进程运行过程中加载的共享动态库（在Linux为.so文件）出现变化，或者进程二进制文件本身出现变化，导致操作系统加载机器的执行码或者加载依赖库的入口发生变化，操作系统出于保护目的将进程终止，产生core dump文件。为解决此问题，请重试。同时请尽可能避免在升级等运维操作过程中，在集群内部运行业务程序，避免升级时因替换文件产生此问题。
  ![](https://support.huaweicloud.com/distributed-ref-v10-gaussdb/public_sys-resources/note_3.0-zh-cn.png)
  此故障的core dump文件的堆栈可能是dl_main及其子调用，它是操作系统用来初始化进程做共享动态库加载的。如果进程已经初始化，但是共享动态库还未加载完成，严格意义上来说，此时进程并未完全启动。
  
 
