#参考:
1. 【PostgreSQL的xlog/Wal归档及日志清理】_postgresql清理找不到的日志-CSDN博客
2. https://zhuanlan.zhihu.com/p/405687213
3. 清理postgresql归档日志并统计_pg删除归档-CSDN博客
基础说明
归档路径下有archive_status目录,会有类似000000010000000000000002.ready和000000010000000000000003.done的文件。
".ready"表示XLOG文件已写满,可以调用归档命令了,".done"表示已归档完成。开启了归档后,只有归档成功的pg_xlog文件才会被清除。
wal命名格式文件名称为16进制的24个字符组成,每8个字符一组,每组的意义如下:
00000001 00000000 00000001 -------- -------- -------- 时间线 逻辑id 物理id |
#查看进度 #select pg_walfile_name(pg_current_wal_lsn()); |
指令说明
通常地说,WAL 最大个数不超过:
( 2 + checkpoint_completion_target ) * checkpoint_segments + 1
在流复制环境下, WAL 最大数不超过:
wal_keep_segments + checkpoint_segments + 1
如果一个旧段文件不再需要了会重命名然后继续覆盖使用,如果由于短期的日志输出高峰导致了超过
3 * checkpoint_segments + 1个文件,直接删除文件。
#查找能清理的xlog的范围 # pg_controldata $PGDATA 根据红框所示的文件,表示该编号之前的文件可以清除 #清除指令 # pg_archivecleanup -d $PGDATA/pg_wal 000000010000000000000009 # 查看归档配置是否生效 # select * from pg_setting where name in (‘wal_level’,’archive_mode’,archive_command’); |
定期清理归档文件的操作说明(示例)
archive_clean.sh
#!/bin/bash #删除1天前的文件 find /data/pgdata/pg_archive -type f -mtime +1 -delete # 删除60分钟前的文件 # find /data/pgdata/pg_archive -type f -mmin +60 -delete #展示操作时间 echo -e $(date "+%Y-%m-%d %H:%M:%S") deleting arch log >> /data/pgdata/arch.log |
echo_log.sh
#! /bin/bash # 删除一天前的日志,1小时执行一次,统计清理的数据量 ARC_PATH=/mnt/data/pg_archive/ LOG_PATH=/mnt/data/clean_log/ BEFORE=$(du -m $ARC_PATH |tr -cd "[0-9]") "$LOG_PATH"archive_clean.sh & ARC_SIGN=$(jobs | grep 'archive_clean.sh') while [[ "$ARC_SIGN" =~ Running ]] do sleep 1 ARC_SIGN=$(jobs | grep 'archive_clean.sh') done AFTER=$(du -m $ARC_PATH |tr -cd "[0-9]") CLEAN=$(($BEFORE-$AFTER)) DATE_SIGN=$(date "+%e") BS_SIGN=$(($DATE_SIGN%2)) if [[ $BS_SIGN == 1 ]];then if [[ $CLEAN -lt 10000 ]];then echo -e $(date "+%Y-%m-\e[1;44m%d\e[0m %H:%M:%S")--清理: "\e[1;42m$CLEAN\e[0m\t" M>> "$LOG_PATH"clean.log else echo -e $(date "+%Y-%m-\e[1;44m%d\e[0m %H:%M:%S")--清理: "\e[1;41m$CLEAN\e[0m\t" M>> "$LOG_PATH"clean.log fi else if [[ $CLEAN -lt 10000 ]];then echo -e $(date "+%Y-%m-\e[1;46m%d\e[0m %H:%M:%S")--清理: "\e[1;42m$CLEAN\e[0m\t" M>> "$LOG_PATH"clean.log else echo -e $(date "+%Y-%m-\e[1;46m%d\e[0m %H:%M:%S")--清理: "\e[1;41m$CLEAN\e[0m\t" M>> "$LOG_PATH"clean.log fi fi sleep 30 "$LOG_PATH"log_clean.sh & |
cleanlog.sh
#!/bin/bash cd /mnt/data/clean_log/ tail -72 clean.log > new.log mv -f new.log clean.log |
加入crontab
#### 查看当前的定时任务 # crontab -l #### 编辑定时任务 #crontab -e #### 例如,定于每天凌晨1点执行,则添加如下指令 00 01 * * * cleanlog.sh |