(转,做记录)
一 环境信息
--1.1 PostgreSQL 版本
9.3.0
--1.2 postgresql.conf
wal_level = hot_standby
archive_mode = on
archive_command = 'test ! -f /archive/pg93/archive_active || cp %p /archive/pg93/%f'
--1.3 归档目录
[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 日志,如下:
--手动归档
[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
自己的实际配置:
wal_level = archive
archive_mode = on
archive_command = 'test ! -f /usr/local/pgsql/archive_xlog/%f && cp %p /usr/local/pgsql/archive_xlog/%f'