alter system set archive_command = '/usr/bin/gzip -c %p > /home/postgres/archived/%f.gz';
然而,7za是所有WAL压缩选项中最有趣的,它尽可能快地提供最高压缩比。可以显式安装7za,它是来自7zip包的一部分。
在centos7上:
sudo yum install epel-releasesudo yum install p7zip
在ubuntu上:
sudo apt install p7zip-full
安装后就可以使用了:
postgres=# alter system set archive_command = '7za a -bd -mx2 -bsp0 -bso0 /home/postgres/archived/%f.7z %p';
ALTER SYSTEM
在我的测试系统中,可以看到小于200kb的归档WAL文件。大小根据WAL的内容而有所不同,这取决于数据库上的事务类型。
-rw-------. 1 postgres postgres 197K Feb 6 12:13 0000000100000000000000AA.7z
-rw-------. 1 postgres postgres 197K Feb 6 12:13 0000000100000000000000AB.7z
-rw-------. 1 postgres postgres 198K Feb 6 12:13 0000000100000000000000AC.7z
-rw-------. 1 postgres postgres 196K Feb 6 12:13 0000000100000000000000AD.7z
-rw-------. 1 postgres postgres 197K Feb 6 12:13 0000000100000000000000AE.7z
将16MB文件压缩到千字节范围内肯定会节省网络带宽和存储空间,同时解决归档落后的问题。
还原WALs
归档和获得最高压缩只是其中的一部分,但我们也应该能够在需要时恢复它们。备份工具提供自己的恢复命令选项。例如,pgbackrest可以使用 archive-get :
restore_command = 'pgbackrest --stanza=demo archive-get %f "%p"'
WAL-G提供了wal-fetch选项来执行相同的工作。
如果选择使用gzip手动压缩归档,我们可以在restore_command中使用gunzip程序,如下所示:
gunzip -c /home/postgres/archived/%f.gz > %p
从postgresql12开始,可以使用alter system命令修改:
postgres=# alter system set restore_command = 'gunzip -c /home/postgres/archived/%f.gz > %p';
ALTER SYSTEM
对于7za,可以这样:
postgres=# alter system set restore_command = '7za x -so /home/postgres/archived/%f.7z > %p';
ALTER SYSTEM
但是,与archive_command更改不同,restore_command更改需要重新启动standby数据库。
监控归档进程活动
当前WAL归档可从pg_stat_archiver.status获得,但使用WAL文件名找出gap有点棘手。我用来找出WAL归档滞后的示例查询是这样的:
select pg_walfile_name(pg_current_wal_lsn()),last_archived_wal,last_failed_wal,
('x'||substring(pg_walfile_name(pg_current_wal_lsn()),9,8))::bit(32)::int*256 +
('x'||substring(pg_walfile_name(pg_current_wal_lsn()),17))::bit(32)::int -
('x'||substring(last_archived_wal,9,8))::bit(32)::int*256 -
('x'||substring(last_archived_wal,17))::bit(32)::int
as diff from pg_stat_archiver;
这里需要注意的是,当前的WAL和要归档的WAL具有相同的时间线,以便此查询能够正常工作,这是常见的情况。我们很少会遇到与生产中不同的情况。因此,在监视PostgreSQL服务器的WAL归档时,此查询可能会有很好的帮助。