一、PostgreSQL如何实现归档日志的异机备份?
之前有人询问oracle中的异机归档备份在PostgreSQL中如何实现,认真的想想也找了下PG的文档,发现并没有相关的操作使用说明,那么PG到底能不能做异机备份呢?
首先:
我们要从PostgreSQL的归档配置文件研究一下
wal_level = minimal # minimal, archive, hot_standby, or logical
archive_mode = off # allows archiving to be done
archive_command = ‘’ # command to use to archive a logfile segment
# placeholders: %p = path of file to archive
# e.g. ‘test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f’
通过以上的配置我们发现跟归档相关的三个核心参数,其中wal_level 、archive_mode 的使用在参数说明中就已经给出相对应的固定几个value,根本实现不了异机的备份。
那么剩下的archive_command 参数的说明发现可操作的灵活度还是蛮高的,我之前在archive_command 中实现过归档日志的压缩、兼容shell语法、 逻辑或,逻辑与运算。
二、分析archive_command 实现归档的异机备份
由于有过之前的归档压缩经验,考虑到archive_command中可以支持操作系统级的命令,那么异机拷贝也就不是什么难事了。
1、先分析下archive_command中说白了就是对%p 和%f的操作,
%p 要归档的wal路径
%f 归档的wal文件名
2、要通过系统来实现异机文件拷贝的动作
scp 命令
3、如何实现免密的scp 动作呢?
免密登录
三、实现异机归档的步骤:
1、编写archive_command,拷贝归档目录下的文件到对端的归档目录下
scp %p user@X.X.X.X:/对端归档路径/pg_%f
2、对端机器创建归档目录:
[root@node1 ]# mkdir archive_31
[root@node1 ]# chown pguser.pguser archive_31/
3、配置免密:
生成公钥私钥对
ssh-keygen -t rsa
拷贝公钥到对端机器
scp id_rsa.pub root@10.80.x.x:~/.ssh/id_rsa.pub_temp
将公钥的内容记得以追加的方式添加.ssh目录下的authorized_keys文件,若文件不存在则新建
4、对端机器操作
cat id_rsa.pub_temp >> authorized_keys
5、验证:
scp id_rsa.pub root@10.80.5.25:/tmp
Address 10.80.5.25 maps to localhost, but this does not map back to the address - POSSIBLE BREAK-IN ATTEMPT!
id_rsa.pub 100% 392 0.4KB/s 00:00
6、修改postgresql.conf配置文件
wal_level = archive
archive_mode = on
archive_command = 'scp %p root@10.80.x.x:/home/pguser/archive_31/pg_%f'
##PostgreSQL内部调用命令,对照更能增加理解
scp pg_xlog/00000001000003AF00000017 root@10.80.x.x:/home/pguser/archive_31/pg_00000001000003AF00000017
四、需要注意的事项
在创建密钥对的时候要注意在数据库的用户下执行,把管理数据库用户的登录的秘钥对拷贝对对端机器上,要不数据库日志会报错,
2020-06-09 16:38:01 CST,0,LOG,00000,‘archive command failed with exit code 1’,‘The failed archive command was: scp pg_xlog/00000001000003AF00000017 root@10.80.x.x:/home/pguser/archive_31/pg_00000001000003AF00000017’,’’
备注:验证环境是9.x