PostgreSQL:什么情况会触发 WAL 日志归档?

这几天bbs里提了几个关于 WAL 归档的问题,提的问题越来越深入了,其中有个问题大概是这样的:在开启归档的情况下,PostgreSQL 什么情况会触发 WAL 日志归档? 对于这个问题,简单的实验了下,稍后会总结,先来看配置情况。

环境信息

1.1 PostgreSQL 版本
PostgreSQL 9.3.0

1.2 postgresql.conf

1
2
3
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /archive/pg93/archive_active || cp %p /archive/pg93/%f'

1.3 归档目录

1
2
3
4
5
6
7
8
[pg93@redhatB pg93]$ pwd
/archive/pg93

[pg93@redhatB pg93]$ ll
total 32M
-rw-------. 1 pg93 pg93 16M Oct 16 11:05 00000001000000000000007A
-rw-------. 1 pg93 pg93 16M Oct 16 11:07 00000001000000000000007B
-rw-rw-r--. 1 pg93 pg93 0 Oct 16 11:05 archive_active --归档标识文件

备注:归档目录为 “/archive/pg93”,归档脚本为 archive_command 设置的内容,回到本文的问题:什么情况下会触发归档? 经观察只要发生了 WAL 日志切换时,就会触发归档,更进一步分析,目前想到了以下三种切换 WAL 日志的方法。

方法一: 手动切换 WAL 日志

PostgreSQL 提供 pg_switch_xlog() 函数可以手工切换 WAL 日志,如下:

手动归档

1
2
3
4
5
6
7
8
9
[pg93@redhatB ~]$ psql
shpsql (9.3.0)
Type "help" for help.

postgres=# select pg_switch_xlog();
pg_switch_xlog
----------------
0/87000000
(1 row)

备注:执行 pg_switch_xlog() 后,WAL 会切换到新的日志,这时会将老的 WAL日志归档,这里归档到 /archive/pg93 目录。

方法二: WAL 日志写满后触发归档

WAL 日志被写满后会触发归档,文档在说明配置参数 archive_command 时的第一句说就说明了这点,WAL 日志文件默认为 16MB,这个值可以在编译 PostgreSQL 时通过参数 “–with-wal-segsize” 更改,编译后不能修改。

方法三: 设置 archive_timeout

另外可以设置archive 超时参数 archive_timeout ,假如设置 archive_timeout=60 ,那么每 60 s ,会触发一次 WAL 日志切换,同时触发日志归档,这里有个隐含的假设: 当前 WAL 日志中仍有未归档的 WAL 日志内容,有兴趣的朋友可以自己测试下。

参考

最后推荐和张文升共同编写的《PostgreSQL实战》,本书基于PostgreSQL 10 编写,共18章,重点介绍SQL高级特性、并行查询、分区表、物理复制、逻辑复制、备份恢复、高可用、性能优化、PostGIS等,涵盖大量实战用例!

购买链接:https://item.jd.com/12405774.html

PostgreSQL实战
感谢支持!
0%