一、问题原因
 
 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文件,当数据库操作出错时恢复到指定时间