Skip to content

Archive wal归档

介绍

所谓WAL日志归档,其实就是把在线的WAL日志备份出来。

配置

vi postgresql.conf

wal_level='replica'

# - Archiving -

archive_mode = on               # enables archiving; off, on, or always
                                # (change requires restart)
archive_command = 'test ! -f /mnt/backup/%f && cp %p /mnt/backup/%f'
                                # command to use to archive a logfile segment
                                # placeholders: %p = path of file to archive
                                #               %f = file name only
                                # e.g. 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
#archive_timeout = 0            # force a logfile segment switch after this
                                # number of seconds; 0 disables

参数说明
  • wal_level archive 或更高级别
  • archive_mode on 开启归档模式,always 主从模式时,从库也开启归档模式。需要重启数据库
  • archive_command 归档时触发的命令或脚本, 不需要重新启动数据库。 systemctl reload postgresql-10 即可。
  • archive_timeout 可以理解为超过指定时间强制执行 select pg_switch_wal(); 场景, 数据库不是很活跃,数据库wal日志产生的过慢时。
归档触发条件说明:

1 手动执行 select pg_switch_wal();
2 WAL 日志写满后触发归档 WAL 日志文件默认为 16MB,这个值可以在编译 PostgreSQL 时通过参数 “–with-wal-segsize” 更改,编译后不能修改。
3 如果设置 archive_timeout, 超时触发。

归档备份说明:

在数据库data目录的pg_wal文件夹中存放着我们需要备份的wal文件,
其中 archive_status文件夹里面存放的是状态文件,可以归档的标记为ready,归档后为done

简单尝试

创建备份存储目录

mkdir /mnt/backup/
chown postgres:postgres /mnt/backup/
chmod 0700 /mnt/backup/

配置数据库

wal_level='replica'
archive_mode = on
archive_command = 'test ! -f /mnt/backup/%f && cp %p /mnt/backup/%f'

重启或reload 使配置生效

手动触发,查看结果 select pg_switch_wal();

如果遇到问题结合查看数据库日志

查看归档状态

postgres=# select * from pg_stat_archiver ;  
 archived_count |    last_archived_wal     |      last_archived_time       | failed_count |     last_failed_wal      |       last_failed_time        |         stats_reset          
----------------+--------------------------+-------------------------------+--------------+--------------------------+-------------------------------+------------------------------
             64 | 00000001000000C3000000A6 | 2019-03-15 09:23:46.991612+08 |           27 | 00000001000000C30000006B | 2019-03-14 14:05:04.921754+08 | 2019-03-07 10:08:45.58083+08
实际应用

目标:按日期存放wal日志到/mnt/archdir/

归档脚本

vi archive.sh     
#!/bin/bash    

export LANG=en_US.utf8    
export DATE=`date +"%Y%m%d"`    

BASEDIR="/mnt/archdir"    

if [ ! -d $BASEDIR/$DATE ]; then    
  mkdir -p $BASEDIR/$DATE    
  if [ ! -d $BASEDIR/$DATE ]; then    
    echo "error mkdir -p $BASEDIR/$DATE"    
    exit 1    
  fi    
fi    

cp $1 $BASEDIR/$DATE/$2    
if [ $? -eq 0 ]; then    
  exit 0    
else    
  echo -e "cp $1 $BASEDIR/$DATE/$2 error"    
  exit 1    
fi    

echo -e "backup failed"    
exit 1    

权限

chmod 700 archive.sh  

配置调用命令

archive_command = 'archive.sh %p %f'  

重新加载生效

systemctl reload postgresql-10

扩展阅读

如何删除wal文件

#切换到数据存放目录
cd /var/lib/pgsql/10/data/
#查看数据库当前状态
/usr/pgsql-10/bin/pg_controldata .
#根据当前状态删除无用wal
/usr/pgsql-10/bin/pg_archivecleanup -d pg_wal/ 00000001000000C30000006D