Objective: 使用 LVM 快照备份备用数据库(同步流复制)。
运行 pg_start_backup 时:
postgres=# SELECT pg_start_backup('label');
ERROR: recovery is in progress
HINT: WAL control functions cannot be executed during recovery.
是否可以从主数据库的集群目录复制backup_label
并tablespace_map
从主数据库的集群目录到备用数据库的集群目录,以便执行备用集群目录的 LVN 快照备份?
要在备用服务器上执行此操作,您需要像主服务器一样对其进行配置以启用级联复制[1]。
要执行您需要的操作(使用 LVM 备份),您必须:
运行
pg_start_backup
:制作 lvm 快照[2](并将其导出到文件 [3]),例如:
运行
pg_stop_backup
功能:希望能帮助到你。
参考:
备份步骤
在主数据库上
archive_mode = on
在base/postgresql.conf
select pg_start_backup(‘backup_label’);
备用数据库
rsync –avr /var/lib/pgsql95/* /tmp/pgsql95/
传输文件生成
pg_start_backup()
:rsync -avr postgres@xxxxx:/var/lib/pgsql95/base/tablespace_map /tmp/pgsql95/base
rsync -avr postgres@xxxxx:/var/lib/pgsql95/base/backup_label /tmp/pgsql95/base
在主数据库上
select pg_stop_backup();
传输归档 WAL 文件
rsync –avr /var/lib/pgsql95/archivedir/* \ postgres@xxxxx:/tmp/pgsql95/archivedir
恢复步骤
recovery.conf
在要恢复的数据库集群中编辑recovery_target_timeline = 'latest'
restore_command = 'cp -f /tmp/archivedir/%f %p </dev/null'
postgresql.conf
pg_ctl –D /tmp/pgsql95/base start
我决定“自己动手”,最终我花了比预期更多的工作,所以我决定发布我的脚本:
https://gitlab.com/tobixen/pglvmbackup
对我来说最大的复杂性之一是应该从从服务器获取备份,然后需要以“非独占备份模式”执行 pg_start_backup,这再次意味着我们不能简单地运行简单的“pg_start_backup()”使用 pgsql ...我们需要保持该会话直到备份完成,这在坚持使用 bash 时会增加一些复杂性。为此,我最终使用了 bash 概念“coproc”。
我在这里看到其他建议的解决方案是在主服务器而不是从服务器上运行“pg_start_backup()”,我不是 100% 确信这会产生预期的效果。
在进行 lvm 快照时,使用 pg_start_backup 和 pg_stop_backup 可以说是没有实际意义的,但我想保证安全。