• 沒有找到結果。

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}])

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

在连接上数据库后,便可以通过执行“explain performance select version()”语 句来确定初始化语句执行较慢的原因。更多信息请参考《开发指南》中的“SQL

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)

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

创建连接故障

● gsql: could not connect to server: No route to host

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

● gsql: FATAL: Invalid username/password,login denied.

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

● 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的版本不匹配导致的(也有可能 是环境中存在PostgreSQL的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 "postgres"

DETAIL: User does not have CONNECT privilege.

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

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

gsql -d postgres -U dbadmin -p 8000

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

GRANT CONNECT ON DATABASE postgres TO user1;

说明

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

gsql -d postgres -p 8000

gsql: FATAL: database "postgres" does not exist gsql -d postgres -U user1 -W gauss@789 -p 8000 gsql: FATAL: Invalid username/password,login denied.

● gsql: FATAL: sorry, too many clients already,active/non-active: 197/3.

此问题是由于系统连接数量超过了最大连接数量。请联系数据库DBA进行会话连 接数管理,释放无用会话。

关于查看用户会话连接数的方法如表3-24。

会话状态可以在视图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)

3-24 查看会话连接数 制。SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='user1';

rolname | rolconnlimit

SELECT COUNT(*) FROM V$SESSION WHERE USERNAME='user1';

count 1 (1 row)

查看指定数据库的会话

连接数上限。 执行如下命令查看连接到指定数据库postgres的会话 连接数上限。其中-1表示没有对数据库postgres设置 连接数的限制。

SELECT DATNAME,DATCONNLIMIT FROM PG_DATABASE WHERE DATNAME='postgres';

datname | datconnlimit postgres | -1 (1 row)

查看指定数据库已使用

的会话连接数。 执行如下命令查看指定数据库postgres上已使用的会 话连接数。其中,1表示数据库postgres上已使用的会 话连接数。

SELECT COUNT(*) FROM PG_STAT_ACTIVITY WHERE DATNAME='postgres';

SELECT COUNT(*) FROM V$SESSION;

count 10 (1 row)

● gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired

gsql在向数据库发起连接的时候,会有5分钟超时机制,如果在这个超时时间内,

● 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的pg_hba.conf里配置了当前客户端IP使用"gss"方式来做认证,该认证算 法不支持用作客户端的身份认证,请修改到"sha256"后再试。

说明

● 请不要修改pg_hba.conf中数据库集群主机的相关设置,否则可能导致数据库功能故 障。

● 建议业务应用部署在数据库集群之外,而非集群内部。