常见问题解决

日常监控

cluster

show cluster_nodes; #查看节点信息,是否存在down状态

pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898 #检查主备节点是否正常

pcp_node_info -U admin -h 192.168.2.98 -p 9898 #后端节点信息,是否有udb节点下线

ps aux | grep unvdbcluster #进程是否存在

ip a | grep 192.168.2.98 #高可用Ip是否位于领导节点

/data/udb-clus/log/ #日志是否有报错

udb

select client_addr, sync_state from pg_stat_replication; #在主库检查同步状态是否正常

select pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_flush_lsn(),write_lsn)) delay_wal_size,* from pg_stat_replication ; #在主库检查同步延迟是否过大

/data/backup/ #备份数据是否正常

du -sh /data/udb/ud_wal/ #wal目录是否过大

/data/udb/log/ #日志是否有报错

如何正确重启集群

cluster重启

查看主节点和备节点,最好先重启备节点,再重启主节点

以下命令显示主节点是192.168.2.92,备节点是192.168.2.91

[root@clus-91 ~]# pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898 
Password: 
2 2 YES 192.168.2.92:9999 Linux clus-92 192.168.2.92
192.168.2.92:9999 Linux clus-92 192.168.2.92 9999 9000 4 LEADER 0 MEMBER
192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 7 STANDBY 0 MEMBER

高可用ip位于92节点

[root@clus-92 ~]# ip a| grep 192.168.2.98
    inet 192.168.2.98/24 scope global secondary eth0:0

重启备节点,并检查日志是否有异常报错

[root@clus-91 ~]# systemctl restart unvdbcluster
vi /data/udb-clus/log/unvdbcluster-星期.log (修改为实际目录)

二次检查主备节点信息,确保备节点正常,再重启主节点

[root@clus-91 ~]# pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898
Password: 
2 2 YES 192.168.2.92:9999 Linux clus-92 192.168.2.92
192.168.2.92:9999 Linux clus-92 192.168.2.92 9999 9000 4 LEADER 0 MEMBER
192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 7 STANDBY 0 MEMBER

重启主节点,并检查日志是否有异常报错

[root@clus-92 ~]# systemctl restart unvdbcluster
vi /data/udb-clus/log/unvdbcluster-星期.log (修改为实际目录)

最后检查主备节点信息

[root@clus-91 ~]# pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898 
Password: 
2 2 YES 192.168.2.92:9999 Linux clus-92 192.168.2.92
192.168.2.92:9999 Linux clus-92 192.168.2.92 9999 9000 4 LEADER 0 MEMBER
192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 7 STANDBY 0 MEMBER

高可用ip位于92节点

[root@clus-92 ~]# ip a| grep 192.168.2.98
 inet 192.168.2.98/24 scope global secondary eth0:0

注:主节点正常重启操作会比较快,不一定满足触发高可用IP转移条件。具体触发规则参考”cluster配置参数详解”章节。

udb数据库重启

检查udb主从信息,最好先重启从库,再重启主库

以下命令显示192.168.2.81为主库,192.168.2.82为从库

[root@clus-92 udb-clus]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 2 0.500000 up up primary primary 0 none none 2022-08-22 17:36:38
192.168.2.82 5678 2 0.500000 up up standby standby 0 none none 2022-08-22 17:36:38

重启从库,并检查日志 /data/udb/log/unvdb-星期.log(以实际日志为准)

[root@udb-82 ~]# systemctl restart unvdb

登录验证

[root@udb-82 ~]# ud_sql 
ud_sql (22.4)
Type "help" for help.
unvdb=#

二次检查主从信息,确保从库正常才能重启主库

[root@clus-92 udb-clus]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 2 0.500000 up up primary primary 0 none none 2022-08-22 17:36:38
192.168.2.82 5678 2 0.500000 up up standby standby 0 none none 2022-08-22 17:36:38

重启主库,并检查日志 /data/udb/log/unvdb-星期.log(以实际日志为准)

[root@udb-81 ~]# systemctl restart unvdb

登录验证

[root@udb-81 ~]# ud_sql 
ud_sql (22.4)
Type "help" for help.
unvdb=#

最后检查主从信息

[root@clus-92 udb-clus]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 2 0.500000 up up primary primary 0 none none 2022-08-22 17:36:38
192.168.2.82 5678 2 0.500000 up up standby standby 0 none none 2022-08-22 17:36:38

注意: 主库正常重启操作,不一定满足主从切换。切换条件参考”cluster配置参数详解”章节。

如何分析sql报错

sql报错会在日志/data/udb/log/unvdb-星期.log 中记录,主要根据日志报错进行解决。

如何避免脑裂

cluster 采用 Watchdog来协调多个cluster,避免单点故障或脑裂。 Watchdog对其他cluster节点定期检查,以检测cluster的故障。 如果活动节点故障,则备用节点会自动提升为活动状态,并接管高可用虚拟IP。 同时使用arping,可以快速更新arp表。 最后配合 wd_escalation_command 参数,灵活定义命令。 以上多种方式可以很好的避免单点故障或脑裂。

cluster是如何调度sql请求的?

以下语句不会发生负载均衡,只会调度到主库:

SHOW /* NO LOAD BALANCE */ 后面跟的语句 BEGIN ~ END 区间的语句块 SELECT INTO SELECT FOR UPDATE SELECT FOR SHARE SELECT … COPY TO STDOUT EXPLAIN EXPLAIN ANALYZE SELECT…包含写操作

集群故障如何排查和恢复

cluster主备排查恢复

服务启动后,一定会有一个节点被选为领导者,并自动配置高可用IP

检查cluster服务是否启动,如不能启动则根据 /data/udb-clus/log/ 日志提示解决

[root@clus-92 ~]# ps aux | grep unvdbcluster

检查当前主备状态

以下命令显示 主节点是192.168.2.92,192.168.2.91节点关闭

[root@clus-92 ~]# pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898
Password: 
2 2 YES 192.168.2.92:9999 Linux clus-92 192.168.2.92
192.168.2.92:9999 Linux clus-92 192.168.2.92 9999 9000 4 LEADER 0 MEMBER
192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 10 SHUTDOWN 0 MEMBER

检查主节点是否分配高可用ip

如没有分配高可用ip,则根据 /data/udb-clus/log/ 日志提示解决

[root@clus-92 ~]# ip a | grep 192.168.2.98
 inet 192.168.2.98/24 scope global secondary eth0:0

恢复从节点192.168.2.91

重启服务,根据日志提示解决。

[root@clus-91 ~]# systemctl restart unvdbcluster

最后检查主备状态

[root@clus-92 ~]# pcp_watchdog_info -U admin -h 192.168.2.98 -p 9898
Password: 
2 2 YES 192.168.2.92:9999 Linux clus-92 192.168.2.92
192.168.2.92:9999 Linux clus-92 192.168.2.92 9999 9000 4 LEADER 0 MEMBER
192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 7 STANDBY 0 MEMBER

udb主从排查恢复

udb发生故障导致下线后,必须手动加入集群,主要原因是避免主从混乱导致数据不一致。 主要解决思路是: 分清楚主从库—->修补检查数据—->建立同步关系—->验证同步关系及同步延迟—->加入主库—->加入从库—->验证集群节点状态

场景一 从库不在线

此场景一般是从库发生故障下线,手动加入即可。但加入前一定要确认存在/data/udb/standby.signal 文件,以从库身份加入。

[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 2 0.500000 up up primary primary 0 none none 2022-09-27 16:09:35
192.168.2.82 5678 3 0.500000 down up standby standby 0 none none 2022-09-27 14:51:09

确认从库状态

[root@udb-82 data]# ud_controldata -D /data/udb/ | grep -i 'database cluster state'
Database cluster state:               in archive recovery

再次从主库上确认从库状态

unvdb=# select * from pg_stat_replication;
  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |        backend_start         | backe
nd_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync_
state |          reply_time           
-------+----------+---------+------------------+--------------+-----------------+-------------+------------------------------+------
--------+-----------+------------+------------+------------+------------+-----------+-----------+------------+---------------+------
------+-------------------------------
 14109 |    16384 | rep     | walreceiver      | 192.168.2.82 |                 |       52076 | 2022-09-27 16:10:09.63818+08 |      
        | streaming | 0/F8000000 | 0/F8000000 | 0/F8000000 | 0/F8000000 |           |           |            |             0 | async
      | 2022-09-27 16:13:35.257112+08
(1 row)

检查同步延迟,如果延迟过大,不建议加入集群

unvdb=# select pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_flush_lsn(),write_lsn)) delay_wal_size,* from pg_stat_replication ;
 delay_wal_size |  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |        backend_star
t         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | sync
_priority | sync_state |          reply_time           
----------------+-------+----------+---------+------------------+--------------+-----------------+-------------+--------------------
----------+--------------+-----------+------------+------------+------------+------------+-----------+-----------+------------+-----
----------+------------+-------------------------------
 0 bytes        | 14109 |    16384 | rep     | walreceiver      | 192.168.2.82 |                 |       52076 | 2022-09-27 16:10:09
.63818+08 |              | streaming | 0/F8000000 | 0/F8000000 | 0/F8000000 | 0/F8000000 |           |           |            |     
        0 | async      | 2022-09-27 16:15:05.361786+08
(1 row)

加入集群

[root@clus-92 ~]# pcp_attach_node -d -U admin -p 9898 -h 192.168.2.98 -n 1
Password: 
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4
[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 2 0.500000 up up primary primary 0 none none 2022-09-27 16:09:35
192.168.2.82 5678 1 0.500000 waiting up standby standby 0 none none 2022-09-27 16:16:41

场景二 原主库不在线

此场景一般是主库发生故障下线,从库自动提升为主库。 此时需要把原主库配置为从库再以从库身份加入。 但加入前一定要确认存在 /data/udb/standby.signal 文件,以从库身份加入。

[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 3 0.500000 down down standby unknown 0 none none 2022-09-27 16:19:29
192.168.2.82 5678 1 0.500000 waiting up primary primary 0 none none 2022-09-27 16:19:29

方式一 直接把原主库标记为从库。适用于下线时间较短,无修改数据的情况

[root@udb-81 data]# chown  -R udb.udb /data/udb
[root@udb-81 data]# chmod 0700 /data/udb
[root@udb-81 udb]# systemctl restart unvdb

方式二 重新导入数据到从库。适用于下线时间较长,修改数据较多的情况

[root@udb-81 data]# mkdir udb
[root@udb-81 data]# ud_basebackup -D /data/udb -F p --checkpoint=fast -P -h 192.168.2.82 -p 5678 -U rep
Password: 
595885/595885 kB (100%), 1/1 tablespace
[root@udb-81 data]# chown -R udb.udb /data/udb
[root@udb-81 data]# chmod 0700 /data/udb
[root@udb-81 udb]# systemctl restart unvdb

确认从库状态

[root@udb-81 data]# ud_controldata -D /data/udb/ | grep -i 'database cluster state'
Database cluster state:               in archive recovery

再次从主库上确认从库状态

unvdb=# select * from pg_stat_replication;
  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | back
end_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync
_state |          reply_time           
-------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+-----
---------+-----------+------------+------------+------------+------------+-----------+-----------+------------+---------------+-----
-------+-------------------------------
 23298 |    16384 | rep     | walreceiver      | 192.168.2.81 |                 |       36872 | 2022-09-27 16:21:44.218621+08 |     
         | streaming | 0/F9000000 | 0/F9000000 | 0/F9000000 | 0/F9000000 |           |           |            |             0 | asyn
c      | 2022-09-27 16:22:04.430018+08
(1 row)

检查同步延迟,如果延迟过大,不建议加入集群

unvdb=# select pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_flush_lsn(),write_lsn)) delay_wal_size,* from pg_stat_replication ;
 delay_wal_size |  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_sta
rt         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | syn
c_priority | sync_state |          reply_time           
----------------+-------+----------+---------+------------------+--------------+-----------------+-------------+--------------------
-----------+--------------+-----------+------------+------------+------------+------------+-----------+-----------+------------+----
-----------+------------+-------------------------------
 0 bytes        | 23298 |    16384 | rep     | walreceiver      | 192.168.2.81 |                 |       36872 | 2022-09-27 16:21:44
.218621+08 |              | streaming | 0/F9000000 | 0/F9000000 | 0/F9000000 | 0/F9000000 |           |           |            |    
         0 | async      | 2022-09-27 16:22:14.460488+08
(1 row)

检查状态并加入集群

[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 3 0.500000 down up standby standby 0 none none 2022-09-27 16:19:29
192.168.2.82 5678 1 0.500000 waiting up primary primary 0 none none 2022-09-27 16:19:29

[root@clus-92 ~]# pcp_attach_node -d -U admin -p 9898 -h 192.168.2.98 -n 0
Password: 
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4

[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 1 0.500000 waiting up standby standby 0 none none 2022-09-27 16:30:12
192.168.2.82 5678 1 0.500000 waiting up primary primary 0 none none 2022-09-27 16:19:29

场景三 主从库都不在线,业务不可用

此场景一般是主库和从库都发生故障下线,或者从库没恢复时主库又发生故障。有可能还发生了主从切换。 此时一定要先分清楚主库和从库。确认好同步状态,先加入主库,再加入从库。

[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 3 0.500000 down down standby unknown 0 none none 2022-09-27 16:31:19
192.168.2.82 5678 3 0.500000 down down standby unknown 0 none none 2022-09-27 16:31:20

检查所有udb主从状态

[root@udb-82 data]#  ls /data/udb/standby.signal
ls: cannot access /data/udb/standby.signal: No such file or directory
#说明82没有从库标记,大概率是主库

[root@udb-81 udb]# ls /data/udb/standby.signal 
/data/udb/standby.signal

依次启动主库和从库的服务

[root@udb-82 data]# systemctl start unvdb

确认从库状态

[root@udb-81 data]# ud_controldata -D /data/udb/ | grep -i 'database cluster state'
Database cluster state:               in archive recovery

再次从主库上确认从库状态

unvdb=# select * from pg_stat_replication;
  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_start         | back
end_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | sync_priority | sync
_state |          reply_time           
-------+----------+---------+------------------+--------------+-----------------+-------------+-------------------------------+-----
---------+-----------+------------+------------+------------+------------+-----------+-----------+------------+---------------+-----
-------+-------------------------------
 23298 |    16384 | rep     | walreceiver      | 192.168.2.81 |                 |       36872 | 2022-09-27 16:21:44.218621+08 |     
         | streaming | 0/F9000000 | 0/F9000000 | 0/F9000000 | 0/F9000000 |           |           |            |             0 | asyn
c      | 2022-09-27 16:22:04.430018+08
(1 row)

检查同步延迟,如果延迟过大,不建议加入集群

unvdb=# select pg_size_pretty(pg_wal_lsn_diff(pg_current_wal_flush_lsn(),write_lsn)) delay_wal_size,* from pg_stat_replication ;
 delay_wal_size |  pid  | usesysid | usename | application_name | client_addr  | client_hostname | client_port |         backend_sta
rt         | backend_xmin |   state   |  sent_lsn  | write_lsn  | flush_lsn  | replay_lsn | write_lag | flush_lag | replay_lag | syn
c_priority | sync_state |          reply_time           
----------------+-------+----------+---------+------------------+--------------+-----------------+-------------+--------------------
-----------+--------------+-----------+------------+------------+------------+------------+-----------+-----------+------------+----
-----------+------------+-------------------------------
 0 bytes        | 23298 |    16384 | rep     | walreceiver      | 192.168.2.81 |                 |       36872 | 2022-09-27 16:21:44
.218621+08 |              | streaming | 0/F9000000 | 0/F9000000 | 0/F9000000 | 0/F9000000 |           |           |            |    
         0 | async      | 2022-09-27 16:22:14.460488+08
(1 row)

检查业务数据是否正常

检查状态并加入集群

#检查节点状态,第一行0号为从standby,第二行1号为主primary
[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 3 0.500000 down up standby standby 0 none none 2022-09-27 16:31:19
192.168.2.82 5678 3 0.500000 down up standby primary 0 none none 2022-09-27 16:31:20
#先加入主库
[root@clus-92 ~]# pcp_attach_node -d -U admin -p 9898 -h 192.168.2.98 -n 1
Password: 
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4
#再次检查状态
[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 3 0.500000 down up standby standby 0 none none 2022-09-27 16:31:19
192.168.2.82 5678 1 0.500000 waiting up primary primary 0 none none 2022-09-27 16:41:53
#再加入从库
[root@clus-92 ~]# pcp_attach_node -d -U admin -p 9898 -h 192.168.2.98 -n 0
Password: 
DEBUG: recv: tos="m", len=8
DEBUG: recv: tos="r", len=21
DEBUG: send: tos="C", len=6
DEBUG: recv: tos="c", len=20
pcp_attach_node -- Command Successful
DEBUG: send: tos="X", len=4
#再次检查状态
[root@clus-92 ~]# pcp_node_info -U admin -h 192.168.2.98 -p 9898
Password: 
192.168.2.81 5678 1 0.500000 waiting up standby standby 0 none none 2022-09-27 16:42:03
192.168.2.82 5678 1 0.500000 waiting up primary primary 0 none none 2022-09-27 16:41:53

场景四 多个主库,无从库情况。

此场景一般是主库发生故障下线,从库自动提升为主。但原主库又以主库身份被误操作加入集群。 此时一定要先分清楚主库和从库。确认好同步状态,先加入主库,再加入从库 同时也要确定是否产生数据混乱,必要时进行手动修补数据。

参考 场景三 先分清楚主从库,再建立同步关系,最后依次加入主从库

场景五 多个从库,无主库情况

此场景同场景四相似,但数据混乱的可能性不高。 参考 场景三 先分清楚主从库,再建立同步关系,最后依次加入主从库

当从节点产生严重延迟时,cluster还会不会调度到这个节点

以下配置与延迟检查相关,当延迟大于delay_threshold或检查失败时,不会调度到对应节点。 ##复制延迟检查配置 sr_check_period = 10 #基于流复制的延迟检查间隔秒数 sr_check_user = ‘udb超级用户’ #延迟检查使用的用户名 sr_check_password = ‘超级用户密码’ #延迟检查使用的密码 sr_check_database = ‘unvdb’ #延迟检查使用的数据库 delay_threshold = 1000000 #如果从库延时超过这个字节点,将停止向从库发送查询操作,将所有操作调度到主库。

集群连接失败-后端服务器全部下线

报错:

server closed the connection unexpectedly This probably means the server terminated abnormally before or while processing the request.

原因:

后端服务器全部不在线

解决:

1,检查后端节点状态

/data/soft/unvdbcluster/bin/pcp_node_info -U admin -p 9898 -h 高可用IP Password: 192.168.2.81 5678 3 0.500000 down up standby primary 0 none none 2022-09-08 16:10:07 192.168.2.82 5678 3 0.500000 down up standby standby 0 none none 2022-09-08 16:22:38 如上表示所有节点都是down状态,并且2.81是主实例

2,检查2.81主实例状态

在主节点执行 /data/soft/unvdb/bin/ud_controldata -D /data/udb/ Database cluster state: in production #表示当前数据目录是主实例, #Database cluster state: in archive recovery #表示当前数据目录是从实例

3,启动数据库

systemctl start unvdb 如启动失败,分析/data/udb/log/日志

4,检查数据正常

ud_sql 登录数据库,检查数据是否正常。

5,加入群集

pcp_attach_node -d -U admin -p 9898 -h 高可用ip -n 0 #把0号节点加入集群 此时集群可以正常连接,按以上步骤依次加入其它节点即可。

集群连接失败-高可用ip不可用

报错:

could not connect to server: Connection refused Is the server running on host “高可用ip” and accepting TCP/IP connections on port 9999?

原因:

高可用ip不可用,或防火墙拒绝访问

解决:

首先,连接任意一个节点IP,如不正常,尝试重启集群服务systemctl start unvdbcluster,并检查 /data/udbclus/log/ 日志进一步分析原因;如正常则继续; 然后,检查可用节点IP集群高可用IP信息 /data/soft/unvdbcluster/bin/pcp_watchdog_info -U admin -p 9898 -h 可用节点本身IP,非高可用IP Password: 2 2 YES 192.168.2.91:9999 Linux clus-91 192.168.2.91 192.168.2.91:9999 Linux clus-91 192.168.2.91 9999 9000 4 LEADER 0 MEMBER Not_Set 192.168.2.92 9999 9000 0 DEAD 0 MEMBER 此例显示2.91节点是领导者,高可用IP应该位于此节点 最后,重点检查2.91节点,ifconfig 检查是否存在高可用IP,如不存在,尝试重启此节点集群服务systemctl start unvdbcluster;如存在高可用IP则重启检查防火墙配置

canceling statement due to conflict with recovery

报错:

ERROR: canceling statement due to conflict with recovery DETAIL: User query might have needed to see row versions that must be removed. STATEMENT: select ….

原因:

此类错误通常出现在从库,原因是此查询操作会被负载均衡调度到从库, 但此时从库正在重放主库的wal日志(在主库相关数据的删除修改等写操作)和当前的查询操作冲突

解决方案一:

在报错的sql前添加 /* NO LOAD BALANCE */ ,使sql不使用负载均衡,强制调度到主库。从而避免此类错误发生。

解决方案二:

修改配置文件,适当提高 max_standby_streaming_delay = 30s #当发生冲突时,从库等待wal应用的最长时间。如果冲突语句在此时间段之后仍在运行,则 udb 将取消该语句并发出以下错误消息ERROR: canceling statement due to conflict with recovery max_standby_archive_delay =30s #冲突的查询执行的最大时间,一旦超过此值,查询将被取消。 注意,以上参数可能会增加同步延时。

DEBUG调试

DEBUG 会记录所有sql及watchdog等详细日志,要特别注意日志文件增长会非常快。

vi /data/udb-clus/start.sh 
找到$UNVDBMGR -D ... 添加 -d 参数,即可开启debug

systemctl restart unvdbcluster#重启生效