一、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