暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

GaussDB常见问题处理

Olivia 2023-08-07
442

连接性能问题
开启了log_hostname,但是配置了错误的DNS导致的连接性能问题。
在连接上数据库,通过“show log_hostname”语句,检查数据库中是否开启了log_hostname参数。

如果开启了相关参数,那么数据库内核会通过DNS反查客户端所在机器的主机名。这时如果数据库CN所在的主机配置了不正确的/不可达的DNS服务器,那么会导致数据库建立连接过程较慢。此参数的更多信息详见GUC参数log_hostname。

数据库内核执行初始化语句较慢导致的性能问题。
此种情况定位较难,可以尝试使用Linux命令:strace。

Password for MyUserName:

此时便会在屏幕上打印出数据库的连接过程。比如较长时间停留在下面的操作上:

poll([{fd=3, events=POLLIN|POLLERR}], 1, -1) = 1 ([{fd=3, revents=POLLIN}])

此时便可以确定是数据库执行“SELECT VERSION()”语句较慢。

在连接上数据库后,便可以通过执行“explain performance select version()”语句来确定初始化语句执行较慢的原因。更多信息,详见《开发者指南》中“SQL调优指南 > SQL执行计划介绍”章节。

另外还有一种场景不太常见:由于数据库CN所在机器的磁盘满或故障,此时所查询等受影响,无法进行用户认证,导致连接过程挂起,表现为假死。解决此问题清理数据库CN的数据盘空间便可。

TCP连接创建较慢问题。
此问题可以参考上面的初始化语句较慢排查的做法,通过strace侦听,如果长时间停留在:


或者


那么说明客户端与数据库端建立物理连接过慢,此时应当检查网络是否存在不稳定、网络吞吐量太大的问题。

创建连接故障


此问题一般是指定了不可达的地址或者端口导致的。请检查-h参数与-p参数是否添加正确。


此问题一般是输入了错误的用户名和密码导致的,请联系数据库管理员,确认用户名和密码的正确性。


数据库由于安全问题,禁止远程登录时使用trust模式。这时需要修改pg_hba.conf里的连接认证信息。请联系管理员处理。

说明:
请不要修改pg_hba.conf中数据库集群主机的相关设置,否则可能导致数据库功能故障。建议业务应用部署在数据库集群之外,而非集群内部。

在CN所在的主机连接数据库,添加“-h 127.0.0.1”可以连接,去掉后无法连接问题。
通过执行SQL语句“show unix_socket_directory”检查数据库CN使用的Unix套接字目录,是否与shell中的环境变量$PGHOST一致。

如果检查结果不一致,那么修改PGHOST环境变量到GUC参数unix_socket_directory指向的目录便可。


此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的,请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。


此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的(也有可能是环境中存在PostgreSQL的libpq.so),请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。

Is the server running on host "xx.xxx.xxx.xxx" and accepting TCP/IP connections on port xxxx?

此问题是由于网络连接故障造成。请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端,则说明网络连接出现故障。请联系网络管理人员排查解决。

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 "postgres"
DETAIL: User does not have CONNECT privilege.

此问题是由于用户不具备访问该数据库的权限,可以使用如下方法解决。

使用管理员用户dbadmin连接数据库。


赋予该用户访问数据库的权限。


说明:
实际上,常见的许多错误操作也可能产生用户无法连接上数据库的现象。如用户连接的数据库不存在,用户名或密码输入错误等。这些错误操作在客户端工具也有相应的提示信息。

gsql: FATAL:  database "postgres" does not exist

gsql -d postgres -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);

显示类似如下信息,表示结束会话成功。

----------------------
 t
(1 row)

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论