1.Base基础/3.Icon图标/操作/search备份
1.Base基础/3.Icon图标/操作/search备份
EN
文档
关于AntDB
部署与升级
快速入门
使用教程
运维
调优
工具和插件
高级服务
数据安全
  • 文档首页 /
  • 参考 /
  • 常见问题

常见问题

更新时间:2024-07-01 14:39:44

AntDB 常见问题解答

安装配置

  • LOG: invalid value for parameter "max_stack_depth": 16384

解决方式

登录服务器,修改 /etc/security/limits.conf,增加用户的栈深度大小:

(以 antdb 用户为例)

antdb soft stack unlimited 
antdb hard stack unlimited

原因说明

一个数据库进程在运行时的 STACK 所占的最大安全深度。若发现不能正常运行一个复杂的递归操作或一个复杂函数,建议适当提高该配置的值。

  • ERROR: unrecognized configuration parameter "shared_buffers"

解决方式

登录 adbmgr,执行下述命令:

FLUSH PARAM;

原因说明

部分场景下,由于 adbmgr 的 param 信息未被初始化,手工执行上述命令初始化之后,再 set 参数即可。

  • error while loading shared libraries: libpq.so.5: cannot open shared object file: No such file or directory

解决方式

.bashrc 环境变量中,是否设置了如下环境变量 LD_LIBRARY_PATH

export LD_LIBRARY_PATH=$ADB_HOME/lib:$LD_LIBRARY_PATH

原因说明

某些特殊软件或插件,只识别 .bashrc 而不识别 .bash_profile,添加后退出终端重新登录。

  • Authentication failed (username/password)

解决方式

各主机之间是否配置了互信。

或在命令后添加 password'xxxx' 选项。

下面给出一个示例说明:

antdb=# START AGENT ALL; 
hostname | status | description 
----------+--------+------------------------------------------- 
antdb01 | f | Authentication failed (username/password) 
antdb02 | f | Authentication failed (username/password) 
(2 rows) 
antdb=# 
antdb=# START AGENT ALL PASSWORD'123'; 
hostname | status | description 
----------+--------+------------- 
antdb01 | t | success 
antdb02 | t | success 
(2 rows)

原因说明

AntDB 的 mgr 通过 ssh 远程管理各节点,因此需配置 ssh 互信或添加 password 选项。

  • FATAL: could not create shared memory segment: Cannot allocate memory

解决方式

shared_buffer 设置不合理,超出了 kernel.shmmax 的系统配置。

建议减小 shared_buffer 值,或增大内核参数,如 shmall、shmmax 值。

如果设置超大,大过内存值,则直接报错 Invalid argument。

FATAL: invalid value for parameter "shared_buffers": "222222GB"

HINT: Value exceeds integer range.

原因说明

按上述方式调整配置。

  • FATAL: could not create semaphores: No space left on device

解决方式

max_connections 设置不合理,超出了 kernel.sem 的系统配置。

max_connections 是最大连接数,即允许客户端连接的最大连接数,增大连接可以允许接入更多的客户端,但设置过大同样会造成 DB 启动失败semget是获取信号的一个函数,即 get semaphore。

上述的空间不够不是指的是磁盘空间不够,而是创建 semaphores 时空间参数不够,系统调用参数 semget 报错,但是错误信息感觉有些迷惑......

解决办法通常是减小 max_connections,或者增大内核参数,如 semmni、semmns 等。

原因说明

按上述方式调整配置。

数据库连接

  • FATAL: database "cz" does not exist

解决方式

未指定数据库实例名。 adb 需要指定 -d 选项或在环境变量添加 PGDATABASE=xxx

adb -d shcrm -p xxx -U xxx

原因说明

adb 连接时,若不指定数据库名称,则以下述顺序优先选择: 环境变量 $PGDATABASE > adb 登录时的用户名 若上述 2 个配置名称在数据库中均不存在,则抛出高错误。

  • adb: could not connect to server: Connection refused

解决方式

未指定数据库主机 IP。 adb 需要指定 -h 选项或在环境变量添加 PGHOST=x.x.x.x

adb -h xxx -d xxx -p xxx -U xxx

原因说明

连接参数配置不全。

  • adb: could not connect to server: No such file or directory

解决方式

未指定数据库监听端口。 adb 需要指定 -p 选项或在环境变量添加 PGPORT=xxx

adb -p xxx -d xxx -U xxx

原因说明

连接参数配置不全。

  • FATAL: role "cz" does not exist

解决方式

未指定数据库连接用户名。 adb 需要指定 -U 选项 或 在环境变量添加 PGUSER=xxx

adb -U xxx -d xxx -p xxx

原因说明

连接参数配置不全。

  • adb: could not connect to server: Connection refused

解决方式

为安全起见,默认禁用了远程连接访问功能,只允许 localhost 连接。那么,如何启用该功能呢?为了启用网络或者远程访问功能,需要在 postgresql.conf 文件中添加或者编辑下列内容:listen_addresses = '*' 。在 pg_hba.conf 添加如下内容,以便允许用户通过某种method 来访问数据库:

# TYPE DATABASE USER CIDR-ADDRESS METHOD

host all all 10.20.21.0/24 trust

postgresql.conf

配置项说明
listen_addresses = ' * ' # listen_addresses指定了要侦听的IP地址。默认只监听 localhost 的地址,也就是禁止远程服务器来访问。在大多数情况下,会接受所有主机的连接,所以可以使用“*”,它表示所有IP地址。如果只接受指定 ip 的连接,则在pg_hba.conf 进行配置。

pg_hba.conf

配置项说明
TYPEType = host表示远程连接。Type = local表示本地 Unix domain socket 连接。
DATABASEDatabase = all 表示所有数据库。其他名字要求严格匹配,还可以规定一个由逗号分隔的数据库列表。
USERUser = all 表示所有用户。其他名字要求严格匹配,还可以规定一个由逗号分隔的用户列表。
CIDR-ADDRESSCIDR-ADDRESS 由两部分组成,即 IP 地址/子网掩码。子网掩码规定了 IP 地址中前面哪些位表示网络编号。这里 /0 表示IP地址中没有表示网络编号的位,这样的话全部的IP地址都匹配,例如 192.168.0.0/24 表示匹配前 24 位,所以它匹配任何 192.168.0.x 形式的 IP 地址。
METHODMethod = trust 表示可信认证,允许免密登录。其他的认证方法包括 MD5,则要求客户端输入密码验证才能访问数据库

其他的一些可能的原因,如下: * 服务端没起来,ps -ef|grep postgres 查看是否存在 postgres 进程 * 监听问题,cat postgresql.conf|grep listen 查看监听地址是否正确 * 以上都没问题,服务器端能连进去,但客户端不行,这时需要查看 pg_hba.conf * 以上都没问题,检查服务器端的 iptables,开启防火墙的访问端口 * 以上都没问题,检查 SELINUX,确保 SELINUX 已关闭

原因说明

按上述说明依次排查

  • Fatal:connection limit exceeded for non-supersers

解决方式

数据库连接数达到上限,需要调整最大连接数配置。

max_connections 是数据库允许的最大连接数,默认值 100, superuser_reserved_connections 是预留给超级用户的连接数,默认值 3 修改这两个参数都需要重启 DB。 与之相关联的参数还有 work_mem,连接数 *work_mem 可以得到 DB 的内存大小,这个调整视服务器的内存大小

原因说明

按上述说明增大 max_connections 的配置,并重启数据库服务生效。

  • FATAL: password authentication failed for user "his"

解决方式

请检查输入的密码是否正确? 此处的密码指该用户 his 在数据库中对应的密码,非操作系统登录密码。

原因说明

密码不正确,请确认密码的正确性。

  • FATAL: no pg_hba.conf entry for host "10.21.28.35", user "adb01", database "postgres", SSL off

解决方式

AntDB 单机版本:

pg_hba.conf 添加一行可信任配置:

host all all 10.21.28.0/24 md5

重新加载配置即可。其中 10.21.28.0 需要访问数据库的客户端IP网段。

adb_ctl -D /data/pgxc_data/cd1/  reload

-D 后面的参数为数据目录。

reload 执行成功后,重新尝试登录。

建议在主备环境上都执行下,防止主备切换后应用无法连接现在的备节点。

AntDB 集群版本: 登录 adbmgr 执行下述命令即可:

add hba coordinator all("host all all 10.21.28.0 24 md5");
add hba gtmcoord all("host all all 10.21.28.0 24 md5");

示例中的 IP 根据实际情况进行修改。

如果执行报错,通过 \h add hba 可查看帮助信息。

执行成功后,重新尝试登录。

原因说明

节点的 pg_hba.conf 未配置该IP信息。

  • adb_ctl: could not open PID file "/ssd/adb40sy/data/cd/pg_hba.conf/postmaster.pid": Not a directory

解决方式

通过 adb_ctl reload 重新加载配置文件时,只需要指定 -D ,即数据库的数据目录,勿需指定到具体的配置文件。 程序会自动重新加载改动后的配置信息。 以下给出一个示例说明:

--错误的方式
adb_ctl -D /antdb/data/cd/pg_hba.conf reload
--正确的方式
adb_ctl -D /antdb/data/cd/ reload

原因说明

adb_ctl reload -D 指定数据目录路径即可,勿需指定到某个具体的配置文件。

  • cached plan must not change result

解决方式

在 jdbc 连接串中禁用 prepareThreshold 功能即可。 以下给出一个示例说明:

jdbc:postgresql://10.78.187.107:6655/postgres?binaryTransfer=False&forceBinary=False&grammar=&prepareThreshold=0

原因说明

执行计划会在服务端被缓存起来,以降低重新生成执行同样计划的开销。 但若在运行过程中更改了表结构,则 JDBC 就会抛出该异常。 在 jdbc 连接串中添加 prepareThreshold=0,禁用 jdbc 的该功能即可。默认 prepareThreshold 设置为 5。

使用相关

  • ERROR: cannot execute INSERT in a read-only transaction

解决方式

AntDB 的 datanode 节点,默认只有读权限,只有 coordinator 具有读写权限。 这里 adb 连接的是 datanode,而不是 coordinator,可以让 adb 指定端口选项 -p。 也可能配置了 pgport 的环境变量,如果配了 pgport 的环境变量,adb 默认连到环境变量指向的那个端口。

adb -p xxx -d xxx -f xxx.sql -v ON_ERROR_STOP=1

原因说明

按上述说明依次排查

  • LOG: archive command failed with exit code (X)

解决方式

硬盘空间不足或归档路径不存在 或用户没有写权限 或用户 ssh 或 scp 或 rsync 命令执行失败

原因说明

按上述说明依次排查

  • LOG: number of page slots needed (X) exceeds max_fsm_pages (Y)

解决方式

max_fsm_pages 最大自由空间映射不足。 建议增加 max_fsm_pages 的同时进行 VACUUM FULL

原因说明

max_fsm_pages 最大自由空间映射不足

  • ERROR: operator does not exist: character = integer

解决方式

AntDB 兼容了 2 种语法模式:默认的 postgres 和兼容的Oracle。 Oracle 语法模式下,AntDB 已经自研兼容了部分数据类型隐式转换的场景,包括该问题的场景已经兼容。 postgres 语法模式下,依然会报该错误。 下面给出一个示例说明:

antdb=# \d sy02
            Table "public.sy02"
 Column |         Type          | Modifiers 
--------+-----------------------+-----------
 id     | character varying(10) | 

antdb=# set grammar TO postgres;
SET
antdb=# select count(*) from sy02 where id=123;
ERROR:  operator does not exist: character varying = integer
LINE 1: select count(*) from sy02 where id=123;
                                          ^
HINT:  No operator matches the given name and argument type(s). You might need to add explicit type casts.
antdb=# set grammar TO Oracle;
SET
antdb=# select count(*) from sy02 where id=123;
 count 
-------
     0
(1 row)

原因说明

为了兼容 Oracle 语法,AntDB 自研兼容了较大部分的 Oracle 数据类型隐式转换的场景。 建议优先尝试使用 Oracle 语法模式。

  • INSERT has more target columns than expressions

解决方式

目标列与表结构的列不匹配。

原因说明

查询语句中的目标列与表结构的列不匹配,或多或少,请仔细检查。

  • fe_sendauth: no password supplied

可能的报错信息:

WARNING:  on coordinator   execute "set FORCE_PARALLEL_MODE = off; 				SELECT adb_PAUSE_CLUSTER();" fail ERROR:  error message from poolmgr:reconnect three thimes , fe_sendauth: no password supplied

处理方式: 检查下集群中 coord 的 hba 信息,是否存在:对于集群内部主机 IP 有 md5 的认证方式。

在 adbmgr 中执行 :show hba nodename 来查看节点的 hba 信息。

  • FATAL: invalid value for parameter "TimeZone": "Asia/Shanghai"

可能的报错信息:

FATAL: invalid value for parameter "TimeZone": "Asia/Shanghai"
FATAL: invalid value for parameter "TimeZone": "asia/shanghai"
FATAL: invalid value for parameter "TimeZone": "utc"

处理方式:

检查 JDBC 的 JAVA_OPTS,是否配置了 user.timezone 参数,若配置了该参数,需严格匹配数据库内默认支持的时区名的大小写。

数据库内支持的时区,使用下列 sql 查询,注意时区名的大小写。

SELECT * FROM adb_catalog.adb_timezone_names;

若 JDBC 中没有配置该参数,则按步骤 2 的说明检查。

检查 AntDB 二进制文件目录下的 share,并确认 timezone 下的时区是否完整。若缺失或不完整,需要重新从一个完整的节点 deploy 所需的文件。

ll $ADBHOME/share/postgresql/timezone
total 232
drwxr-xr-x 2 antdb antdb 4096 Apr 16 15:59 Africa
drwxr-xr-x 6 antdb antdb 4096 Apr 16 15:59 America
drwxr-xr-x 2 antdb antdb 4096 Apr 16 15:59 Antarctica
drwxr-xr-x 2 antdb antdb   25 Apr 16 15:59 Arctic
drwxr-xr-x 2 antdb antdb 4096 Apr 16 15:59 Asia
......
drwxr-xr-x 2 antdb antdb 4096 Apr 16 15:59 US
-rwxr-xr-x 1 antdb antdb  114 Apr 16 15:48 UTC
-rwxr-xr-x 1 antdb antdb 1905 Apr 16 15:48 WET
-rwxr-xr-x 1 antdb antdb 1535 Apr 16 15:48 W-SU
-rwxr-xr-x 1 antdb antdb  114 Apr 16 15:48 Zulu
  • cannot find the datanode master which oid is "xxxx" in pgxc_node of coordinator

解决方式

需要确认当前 datanode 节点的主备状况。根据主备状况确认 pgxc_node 中的 datanode 信息:

  • gtm 主库 &cn 主库的 pgxc_node 中的 datanode 信息正确的话

    UPDATE pgxc_class SET nodeoids='xxx yyy zzz' WHERE nodeoids='aaa bbb ccc';
    
  • pgxc_node 中的 datanode 信息不正确的话

    UPDATE pgxc_node SET node_name='xxxx', node_host='' WHERE oid=xxxx;
    

原因说明

datanode 主备切换成功后,可能会遗漏 pgxc_node 的相关修改。

  • switchover datanode slave 失败

解决方式

需要确认当前 datanode 节点的切换状况:

  • datanode 未进行实际的切换:根据 mgr 中的错误信息,解决问题后再次尝试进行切换

  • datanode 已经进行了实际的切换:需要进行如下的操作

    • mgr 节点
    SET command_mode = sql;
    SELECT oid,* FROM adb_catalog.mgr_node;
    UPDATE adb_catalog.mgr_node SET nodetype='xxxx', nodesync='xxxx',nodemasternameoid='xxxx' WHERE oid=xxxx; --此处需要将datanode的主备库都需要进行update
    
    • gtm 主库和 cn 主库
    SELECT oid,* FROM pgxc_node;
    UPDATE pgxc_node SET node_name='xxxx', node_host='' WHERE oid=xxxx;
    

原因说明

datanode 主备切换成功后,在进行一些校验的时候可能会出错,这时就不能再次进行切换,只能通过修改元数据的方式进行。

节点 down 后恢复

coordinator 节点宕机

当 coordinator 节点所在主机宕机后又不能及时恢复,会影响集群的 DDL 语句无法执行,DML 语句不受影响,此时需要操作如下步骤:

通过 adbmgr 移除不可用 coordinator 节点:

REMOVE COORDINATOR coord2;  # name替换成宕机的节点名称
DROP COORDINATOR coord2;

此时 DDL 语句可以正常执行。

在主机恢复后,通过如下操作重新添加该 coordinator 节点:

ADD COORDINATOR coord2 (host=adb02,port=6655,path='/data/adb/coord');
CLEAN COORDINATOR coord2;
APPEND COORDINATOR coord1 to  coord2;  # coord1为当前集群中的正常coordinator节点。
APPEND ACTIVATE COORDINATOR coord2;

datanode 节点宕机后恢复

datanode 节点所在主机宕机后,repmgrd 后台进程会自动切换到备节点。

在主机恢复后,需要将 down 掉的节点重新添加到集群。

如果 down 掉的是 master 节点,则只能以 slave 的身份重回集群。

添加 node 信息:

ADD DATANODE SLAVE db1 (host=adb01,port=15011,path='/data/adb/db1');
REWIND DATANODE SLAVE db1;

如果 down 掉的是 slave 节点,则直接以原来的身份进行启动即可。

START DATANODE SLAVE db1;

gtm 节点宕机

gtm 节点所在主机宕机后,后台进程会自动切换到备节点。

在主机恢复后,需要将 down 掉的节点重新以 slave 的身份添加到集群。

ADD GTMCOORD SLAVE gtm_2 FOR gtm_1 (host=adb03,port=7329,path='/data/adb/gtm');
CLEAN GTMCOORD SLAVE gtm_2;
APPEND GTMCOORD SLAVE gtm_2;

adbmgr 节点宕机

adbmgr slave 节点所在主机宕机后,不影响 master 的使用,待 slave 节点恢复后,启动即可:mgr_start

adbmgr master 节点所在主机宕机,keepalived 会自动将 slave 节点提升为 master,并将 vip 接管到 slave 主机上。

在 adbmgr master 节点恢复后,重新连接当前主节点做一个备份,执行:

mv /data/adb/mgr /data/adb/mgr_bak
adb_basebackup -h 192.168.1.20 -p 6433 -U adb -D /data/adb/mgr -Xs -Fp -R
chmod 700 /data/adb/mgr
mgr_ctl start -D /data/adb/mgr
# IP、port、dir均替换为实际值

重新启动 keepalived

修改 keepalived.conf (/etc/keepalived/keepalived.conf)

当前主节点的 priority 修改为 100

当前备节点的 priority 修改为 98

按照先主后备的顺序重启 keepalived:

service keepalived restart

观察系统日志。

数据迁移

  • ERROR: COPY escape available only in CSV mode

解决方式

将下述 copy 命令中的 ESCAPE 'OFF' 配置项去掉即可。

\COPY sa.rep_check_data_report_001 from '/etldata/data_rep/sql/REPORT_00118.imp' with delimiter '' NULL AS '' ESCAPE 'OFF';

原因说明

ESCAPE 选项只在 csv 模式生效,而该文件 /etldata/data_rep/sql/REPORT_00118.imp 并非 csv 格式。删掉 ESCAPE 选项即可。

数据备份

  • WAL archive: FAILED (please make sure WAL shipping is setup)

执行 barman check 命令时,返回上述报错信息

barman -c /aifs01/users/antdb/barman/conf/datanode0.conf check datanode0

下面给出一个完整的配置文件示例:

more datanode0.conf 

[barman]
barman_user = antdb
#configuration_files_directory = /aifs01/users/antdb/barman/conf/
barman_home = /aifs01/users/antdb/barman/data/
log_file = /aifs01/users/antdb/barman/log/barman.log
compression = gzip
parallel_jobs =3
minimum_redundancy = 0
retention_policy = RECOVERY WINDOW OF 1 WEEKS
reuse_backup = off

[datanode0]
description = "datanode master datanode0"
ssh_command = ssh antdb@10.1.242.25 -p 22022 -q
conninfo = host=10.1.242.25 port=14332 user=antdb dbname=tstadb
backup_method = rsync
reuse_backup = link
backup_options = exclusive_backup
parallel_jobs = 3
archiver = on
archiver_batch_size = 50

解决方式

确认 datanode0 的 archive_mode 已经设置为打开 on

登录adbmgr或datanode节点
show datanode0 archive_mode;
           type            | status |      message      
---------------------------+--------+-------------------
 datanode master datanode0 | t      | archive_mode = on

确认 datanode0 的 archive_command 设置是否正确?手工执行不报 ssh 连接错误。

很多现场会修改ssh的默认端口,比如改成22022。则建议按下述步骤调整归档命令

SET DATANODE MASTER datanode0 (archive_command = 'rsync --address=10.1.242.27 --port=22022 -a %p antdb@10.1.242.27:/aifs01/users/antdb/barman/data/datanode0/incoming/%f');

如果上述的port命令不生效,还是连接的默认22端口,手工执行时,还是报连接拒绝,则使用 下面的命令设置归档
SET DATANODE MASTER datanode0 (archive_command = 'rsync -e "ssh -p 22022" --address=10.1.242.27 --port=22022 -a %p antdb@10.1.242.27:/aifs01/users/antdb/barman/data/datanode0/incoming/%f');
(各现场ssh版本不一样,可识别的配置项不同)

手工执行一次 wal 日志切换操作

barman -c /data/antdb/barman/etc/barman.conf switch-xlog --force --archive antdb117

原因说明

要么没有打开归档模式,要么归档命令设置或执行失败。 请按上述步骤依次排查。

  • ssh output clean: FAILED (the configured ssh_command must not add anything to the remote command output)

执行 barman check 命令时,返回上述报错信息

barman -c /aifs01/users/antdb/barman/conf/datanode0.conf check datanode0

解决方式

datanode0.conf 的 ssh_command 命令,在最后添加 -q 选项,不产生任何输出信息.

ssh_command = ssh antdb@10.1.242.25 -p 22022 -q

详细的原因说明,请参考: The test that Barman does is to execute 'true' using the ssh_command and checking that the output is empty.

In your case, please check that the following command doesn't produce any output.

链接:https://groups.google.com/forum/#!topic/pgbarman/1xjUU4mnrfI

确保 archive_command 和 barman 配置文件中几个变量值的对应关系

----------archive_command命令示例:
archive_command = 'rsync --address=10.1.242.27 --port=22022 -a %p antdb@10.1.242.27:/aifs01/users/antdb/barman/data/datanode0/incoming/%f'

---------datanode0.conf配置示例:

[barman]
barman_home = /aifs01/users/antdb/barman/data/

[datanode0]

--------两者对应关系:
archive_command命令中的
/aifs01/users/antdb/barman/data/datanode0
必须等于
datanode0.conf配置文件中的 barman_home的配置值 + [datanode0]的配置值
/aifs01/users/antdb/barman/data/datanode0
即:
barman_home的配置值 + [datanode0]的配置值 + 'incoming/%f'固定字符串

原因说明

centos7.2 以后,某些 ssh 场景下需要静默返回输出,即 ssh 命令添加了 -q 静默选项,否则就报标题所示的错误。

  • ERROR: invalid byte sequence for encoding "UTF8":

场景:使用 copy 命令导入数据 例如

\copy t1 from 't1.csv' with csv

原因说明

导入的文件中含非 UTF8 字符集的内容,通常为 GBK 字符集的中文

解决方式

  1. 修改导入文件编码为 UTF8
  2. 指定字符集 \copy t1 from 't1.csv' with csv encoding 'GBK'
问题反馈