一、问题原因
 
 PostgreSQL 的REDO文件被称为WAL文件或XLOG文件,在$PGDATA/pg_wal目录中。
如果开启了归档,则在archive_status目录中,会有大量类似000000010000002C000000B1.ready这样的文件。

没有被清理的原因,通常是postgresql.conf中开启了归档,但没有配置归档保留策略。


  归档模式打开状态查看命令  
cat /var/i2data/pgsql/data/postgresql.conf |grep archive




注意:
   7.1.55及以上版本,不会出现pg_wal撑满根问题,但可能出现/var/i2data/archivedir/目录较大撑满根的问题。如有条件,请尽快升级到7.1.58,该版本已经全面解决pg_wal和archivedir目录较大的问题。如条件不允许,请自行删除该目录下的文件,并根据需要,设置自动清理脚本,或者手动定期清理。



二、解决方法与步骤

1、清理pg_wal

注意:
    因归档文件的特殊性,请按照下述步骤操作,不要自行随意清理。


(1)手工清理

执行查看指定目录数据库集群的控制信息:
/usr/pgsql-11/bin/pg_controldata  /var/i2data/pgsql/data



记录最新检查点的重做日志文件的值,如果数据库默认语言是英文,该属性为“Latest checkpoint's REDO WAL file:”。

执行类似以下命令,进行最新检查点之前的归档清理: 
/usr/pgsql-11/bin/pg_archivecleanup -d /var/i2data/pgsql/data/pg_wal 000000010000000000000002




(2)编写的自动清理脚本

创建脚本文件:vim clear.sh
更改文件权限为777: chmod 777 clear.sh
clear.sh文件内容:

中文版数据库:
#!/bin/bash
LASTWAL=`/usr/pgsql-11/bin/pg_controldata  /var/i2data/pgsql/data |grep "最新检查点的重做日志文件" |awk '{print $2}'`
echo $LASTWAL
/usr/pgsql-11/bin/pg_archivecleanup -d /var/i2data/pgsql/data/pg_wal $LASTWAL


英文版数据库:
#!/bin/bash
LASTWAL=`/usr/pgsql-11/bin/pg_controldata  /var/i2data/pgsql/data |grep "Latest checkpoint's REDO WAL file:" |awk '{print $2}'`
echo $LASTWAL
/usr/pgsql-11/bin/pg_archivecleanup -d /var/i2data/pgsql/data/pg_wal $LASTWAL


执行命令:./clear.sh



说明:可能因环境的差异,导致LASTWAL未被正确获取,进而导致脚本报错(如下)。这种情况,请手工检查命令不用awk过滤时的输出结果,找到正确的位置后对脚本进行修改,然后执行。


注意:
    以上只是做一次性清理,如不进一步配置自动归档清理,则长时间运行的情况下,还是可能再次出现空间塞满的,请按照下述说明配置归档自动清理。



2、归档自动清理设置

(1)linux环境


归档配置方法参考链接
https://blog.51cto.com/1937519/2327897?source=dra

修改以下文件的配置。
vim /var/i2data/pgsql/data/postgresql.conf
需要更改的部分:
set wal_level= replica
archive_mode= on
archive_command = '/bin/cp -i %p /var/i2data/pgsql/data/pg_wal%f'


重启数据库服务
service i2pgsql restart



(2)windows环境

归档配置方法参考链接
https://blog.csdn.net/xialinlin8520/article/details/8929561

创建wal备份目录:  d:\pg_xlog_archive
修改 postgresql.conf配置:
archive_mode = on 
wal_level='archive'
archive_command = 'copy "%p" d:\\pg_xlog_archive\\%f' 

cmd进入目录 C:\Program Files (x86)\info2soft\ctrlcenter\pgsql\bin
登录数据库,需要加上端口号:  psql.exe -U postgres -p 58083
口令为:  HfQchrS5



SELECT pg_reload_conf(); 


SELECT pg_start_backup('label'); 


SELECT pg_stop_backup(); 


注意:
最好保留需要的wal文件,当数据库操作出错时恢复到指定时间



常见问题二:普通日志原因引起的的根目录满问题,可以用以下方法清理:
方法一,临时删除所有日志,清理出部分根目录空间。举例:(具体目录需要根据具体情况调整)
cd /var/i2data/log/
rm -f  *.log
cd /var/i2data/logs
rm -f  *.log
cd /var/i2data/pgsql/data/log
rm -f  *.log
>  /usr/local/openresty/nginx/logs/access.log


方法二,配置crontab 定时清理根目录空间。
systemctl enable crontab
systemctl start crontab
crontab -e 编辑 crontab 加入自动处理内容。
举例如下:(具体目录,保留时间天数需要根据具体情况调整)
0 23 * * *  /usr/bin/find /var/i2data/log -type f -mtime +3 -exec rm {} \;
10 23 * * *  /usr/bin/find /var/i2data/logs -type f -mtime +3 -exec rm {} \;
20 23 * * *  /usr/bin/find /var/i2data/pgsql/data/log -type f -mtime +3 -exec rm {} \;
30 23 * * *  > /usr/local/openresty/nginx/logs/access.log

方法三, 扩容根目录。此方法增对不同格式的磁盘方法有所不同,网上有很多关于扩容根目录的大量信息,这里不做赘述。

方法四, 配置i2node节点日志文件配置到其他空间比较充足的目录。

方法五,把58080端口改为58079,让其他的节点都传不了日志到控制台。
#vi
/var/i2data/conf.d/i2.conf





特殊问题1、notifications如果有false记录必须删除,否则根目录会几分钟之内爆满。
控制机 7.1.70.21051420版本为例
1.登录数据库清除异常数据,即删除notifications中false记录(7.1.72.21120617+版本,这一步可不做):
# psql -U i2soft -h 127.0.0.1 --port 58083
密码:i2s@Shanghai
# select * from notifications where content='false';
# delete from notifications where content='false';
# \q

特殊问题2、一直刷错误日志,导致空间满的第二种情况。
 
登录数据库执行 :

# psql -U i2soft -h 127.0.0.1 --port 58083
密码:i2s@Shanghai
# alter sequence status_id_seq cycle;
# \q

问题解决。

报错截屏,sql 执行截屏:






特殊情况3:
控制机数据库的base目录巨大,即将撑满磁盘空间 

参考FAQ:http://support.info2soft.com/service/public.pl?Action=PublicFAQZoom;ItemID=636;Nav=



以上方法需根据实际情况加以实施,如有疑问,可咨询售后技术服务人员。热线电话:4000078655 转2。