PostgreSQL之WAL日志归档配置

关于pg_wal

pg的wal日志保存在数据库目录下的pg_wal/子目录

这个日志存在的目的是为了保证崩溃后的安全,如果系统崩溃,可以“重放”从最后一次检查点以来的日志项来恢复数据库的一致性。
但是也存在日志膨胀的问题
pg提供如下参数控制wal日志的大小
max_wal_size = 1GB
min_wal_size = 80MB
 
测试一下
1、查看当前pg_wal目录大小
[postgres@mingfan pg_wal]$ pwd
/usr/local/pgsql/data/pg_wal
[postgres@mingfan pg_wal]$ du -sh
16M .

2、插入可产生约2Gwal日志的数据

create table t1(a int);
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));
insert into t1 values (generate_series(1,10000000));

3、查看当前pg_wal目录大小

[postgres@mingfan pg_wal]$ du -sh
1.1G    .

基本符合预期,看下官方的介绍:

max_wal_size (integer)
在自动 WAL 检查点之间允许 WAL 增长到的最大尺寸。这是一个软限制, 在特殊的情况下 WAL 尺寸可能会超过max_wal_size, 例如在重度负荷下、archive_command失败或者高的 wal_keep_segments设置。如果指定值时没有单位,则以兆字节为单位。默认为 1GB。增加这个参数 可能导致崩溃恢复所需的时间。这个参数只能在postgresql.conf 或者服务器命令行中设置。
min_wal_size (integer)
只要 WAL 磁盘用量保持在这个设置之下,在检查点时旧的 WAL 文件总是 被回收以便未来使用,而不是直接被删除。这可以被用来确保有足够的 WAL 空间被保留来应付 WAL 使用的高峰,例如运行大型的批处理任务。 如果指定值时没有单位,则以兆字节为单位。默认是 80 MB。这个参数只能在postgresql.conf 或者服务器命令行中设置。

关于归档

在生产环境,为了保证数据高可用性,通常需要设置归档,所谓的归档,其实就是把pg_wal里面的日志备份出来,当系统故障后可以通过归档的日志文件对数据进行恢复:

配置归档需要开启如下参数:

  • wal_level = replica (pg13默认已经开启replica)
    该参数的可选的值有minimal,replica和logical,wal的级别依次增高,在wal的信息也越多。由于minimal这一级别的wal不包含从基础的备份和wal日志重建数据的足够信息,在该模式下,无法开启wal日志归档

  • archive_mode = on
    上述参数为on,表示打开归档备份,可选的参数为on,off,always 默认值为off,所以要手动打开

  • archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
    该参数的默认值是一个空字符串,他的值可以是一条shell命令或者一个复杂的shell脚本。在shell脚本或命令中可以用 “%p” 表示将要归档的wal文件包含完整路径的信息的文件名,用“%f” 代表不包含路径信息的wal文件的文件名

注意:wal_level和archive_mode参数修改都需要重新启动数据库才可以生效。而修改archive_command则不需要。所以一般配置新系统时,无论当时是否需要归档,这要建议将这两个参数开启

测试一下

1、配置参数

# - Archiving -

archive_mode = on               # enables archiving; off, on, or always
                                # (change requires restart)
archive_command = 'test ! -f /usr/local/pgsql/archive/%f && cp %p /usr/local/pgsql/archive/%f'  

2、重启数据库

pg_ctl -D /usr/local/pgsql/data/ restart

3、插入数据,查看归档

insert into t1 values (generate_series(1,10000000));

 4、查看pg_wal

archive_status下会有已经完成归档的日志信息

 

 通过归档进程也可以看到当前完成归档的日志

原文地址:https://www.cnblogs.com/mingfan/p/14038680.html