openGauss

开源数据库

openGauss社区官网

开源社区

openGauss的xlog不回收原因和修复方案

zhangxb2024-10-16openGauss的xlog不回收原因和修复方案

openGauss的xlog不回收原因和修复方案

介绍几种导致xlog不回收问题的原因。

问题现象

数据库的pg_xlog目录大小一直增长,目录下的xlog文件不回收。超过了阈值,存在空间写满的风险。

原因分析

通常xlog会保留 wal_keep_segments + checkpoint_segments * 2 + 1 个xlog文件,每个文件16MB。

以wal_keep_segments=1024 和 checkpoint_segments=1024为例,大约会保留:(wal_keep_segments+checkpoint_segments * 2 + 1) * 16MB = (1024 + 1024 * 2 + 1) * 16MB = 48GB, 大约会在50GB左右。如果远远超过了这个大小,那么就是有存在xlog不回收问题。

数据库会1min对日志进行一次清理,pg_log里面关键字(attempting to remove WAL),如果长时间日志里面清理xlog文件都是同一个,就有异常导致清理受到阻塞。

常见以下几个方面会引起xlog不回收:

1. 备机故障引起主机xlog不回收

开启enable_xlog_prune=on,在配置备机实例宕掉后,主机需要给备机保留xlog。max_size_for_xlog_prune配置最大保留的xlog目录大小。

备机是否有异常,使用 gs_ctl query -D [数据目录] 来确定,再和下面的备机个数以及状态对比下:

max_size_for_xlog_prune需要设置个合理的值,备机故障时候不会导致xlog无限膨胀。

案例: 一个一主2备集群,用户手动把备机去掉,但是postgresql.conf里面的replconninfo还在,xlog目录日志持续写入不回收。

这时候由于replconninfo在,即主机认为有2个备机需要连,但是异常了没连接上,会给备机保留日志。

后面手动注释掉配置文件里面的replconninfo已经下掉的备机配置。

2. 复制槽不推进引起主备节点xlog均不回收

常见于逻辑复制不推进,主机需要为逻辑复制保留xlog数据。出问题首先查询逻辑复制视图:

select * from pg_replication_slots ;

关注active和restart_lsn这两列。

处理方式:

如果逻辑复制在用,需要应用侧启动正常推进复制槽位点。

确认不再用的删除逻辑复制槽

select pg_drop_replication_slot('slot name');

3. 开启xlog日志归档,但是归档目录异常,导致归档所在节点xlog不回收

开启归档archive_mode=on,但是归档路径不存在或者路径权限不正确,pg_xlog下的日志文件无法移动到归档目录下,也会导致xlog目录大小持续增加。

到归档目录下检查下日志拷贝是否正常来确认归档是否有问题。

4. 备机逻辑复制槽残留导致备机xlog不回收

这种不是正常行为,第二点里面 (2)复制槽不推进引起主备节点xlog均不回收

通过删除逻辑复制槽可以清理。 但是如果主机的删掉了,备机上由于某些故障没有删除逻辑复制槽,那会存在主机上xlog正常清理,但是备机上xlog不回收。

此时需要仅删除备机上的逻辑复制槽,需要从物理层面删除。

(1) 停止该备机:(主机是否带CM停止和启动单个实例命令不同)

gs_ctl stop -D /ogdata/data/dn1  ## 不带CM

cm_ctl stop -n 5 -D /ogdata/data/dn1  ## 带CM, -n 5为第几个实例。

(2) 到数据目录下的 pg_replslot物理删除逻辑复制目录

cd /ogdata/data/dn1/pg_replslot
删除对应复制槽: rm -rf  xxxx

(3) 拉起该备机

gs_ctl start -D /ogdata/data/dn1 -M standby  ## 不带CM

cm_ctl start -n 5 -D /ogdata/data/dn1   ## 带CM