@Mr-13
2020-10-29T00:52:56.000000Z
字数 1742
阅读 140
工作手机运维
pg_archivecleanup
和 pg_rewind
是PG 中两个重要的功能,一个是为了清理过期的 archive log 使用的命令,另一个是你可以理解为物理级别的 wal log的搬运工。
这里主要针对pgsql庞大的归档日志进行清理,主要关注 pg_archivecleanup
;这个命令主要是用于使用了archive log(归档日志)功能的 postgresql ;在 archive log 堆积如山的情况下,来根据某些规则,清理这些日志。
先的说说如果不定期清理会出什么问题:
如果不定期清理archive 如果存放archivelog 的位置无法在接受新的日志,则大量WAL日志会滞留在 wal_log 目录中,则整体数据库系统都会受到影响。
占用大量的存储空间,存储无效的数据
清理archivelog时需要关注的点:
清理时,清理的WAL_LOG 是否已经是包含在最后一次的备份中,保证清理的WAL_LOG 可以从备份文件中恢复数据库;
大白话说:这些成千上万的归档日志中,哪些历史日志已经被后面的日志包含了;已经没用了;我们需要确认这样一个“分割线”。
重点来了:
如上图,pgsql进行数据备份之后,会在wal_log里面有 backup
的标记,这说明这个wal_log之前的数据已经备份了,如果清理这个wal_log之前的log是安全的;不会引起pgsql服务异常。
有了方法,下面实际操作一波:
# root用户下操作即可
[root@wechatdb ~]# pg_archivecleanup -?
如上图,可以看到使用帮助给出了两个使用例子;不建议使用第一个,问题很多,我们使用第二种方式:
# pg_archivecleanup [目录] [wal_log文件名]
# 进入归档日志目录
[root@wechatdb pg_wal]# pwd
/data/pgsql/data/pg_wal
# 查找我们需要的wal_log文件
[root@wechatdb pg_wal]# find . -type f -name '*backup' -print0 | xargs -0 ls -l
[root@wechatdb pg_wal]# pwd
/data/pgsql/data/pg_wal
# 顺便看一下,清理之前一共有多少个wal_log文件
[root@wechatdb pg_wal]# ls . | wc -w
114882
# 总共114882个wal_log文件
根据上面查出的带有backup标记的文件中,我们逐个走一遍(其实只要执行最后一个就行了,这里主要是为了看一下能清理掉多少,挨个走一遍)
[root@wechatdb pg_wal]# pwd
/data/pgsql/data/pg_wal
[root@wechatdb pg_wal]# pg_archivecleanup /data/pgsql/data/pg_wal 000000010000035600000029.00000028.backup
# 执行过程需要等一会儿
# 执行完了之后,再看一下文件数量
[root@wechatdb pg_wal]# ls /data/pgsql/data/pg_wal | wc -w
112665
# 还剩下112665
# 看一下postgres服务进程,如下图:
pgsql服务进程正常运行,服务前端数据查询正常,OK;继续对其他的backup标记文件执行pg_archivecleanup操作。
全部处理完成之后,再看一下 /data/pgsql/data/pg_wal
目录:
如上图。/data
目录所在磁盘从98% 直接降到 14%;/data/pgsql/data/pg_wal
目录大小从 1.8T 直接降到 185G !wal_log文件个数从 114882 减到 11823(就剩下了个零头)。