的Postgres上克隆VM恢复/更新与沃尔玛,而不是使用basebackup
问题描述:
环境的: 800GB的Postgres数据库内(OpenSuse当中)的Postgres上克隆VM恢复/更新与沃尔玛,而不是使用basebackup
正常恢复进程:
- 你必须pg_basebackup恢复(从每周六开始)
- 您有WAL上一个星期六到今天的文件
- 首先:使用pg_basebackup还原
- 然后:使用更新数据库WAL - 文件具有最新数据。 (带的recovery.conf)
我的想法:
为什么每周大pg_basebackup并通过互联网复制到800GB NAS,当你有一些备份软件每天的增量备份。
- 恢复完整的数据库-VM(站昨天)
- 添加WAL-文件(恢复)把这个虚拟机克隆是最新的。
现在我已经做到:
- 我恢复了VM
-
创建的recovery.conf
的restore_command = 'CP /.../%f%P'
rcpostgresql start
我收到以下错误:恢复下一个WAL文件
2017-05-09 16:46:07.780 CEST [2938]: [1-1] user=,db=,app=,client= LOG: database system was shut down at 2017-05-09 16:45:47 CEST
2017-05-09 16:46:07.780 CEST [2938]: [2-1] user=,db=,app=,client= LOG: starting archive recovery
2017-05-09 16:46:08.588 CEST [2952]: [1-1] user=[unknown],db=[unknown],app=[unknown],client=[local] LOG: connection received: host=[local]
2017-05-09 16:46:08.588 CEST [2952]: [2-1] user=postgres,db=postgres,app=[unknown],client=[local] FATAL: the database system is starting up
2017-05-09 16:46:09.391 CEST [2938]: [3-1] user=,db=,app=,client= LOG: restored log file "000000010000070D0000008A" from archive
2017-05-09 16:46:09.434 CEST [2938]: [4-1] user=,db=,app=,client= LOG: contrecord is requested by 70D/8A000028
2017-05-09 16:46:09.434 CEST [2938]: [5-1] user=,db=,app=,client= LOG: invalid primary checkpoint record
2017-05-09 16:46:09.434 CEST [2938]: [6-1] user=,db=,app=,client= LOG: invalid secondary checkpoint link in control file
2017-05-09 16:46:09.434 CEST [2938]: [7-1] user=,db=,app=,client= PANIC: could not locate a valid checkpoint record
2017-05-09 16:46:09.434 CEST [2936]: [4-1] user=,db=,app=,client= LOG: startup process (PID 2938) was terminated by signal 6: Aborted
2017-05-09 16:46:09.434 CEST [2936]: [5-1] user=,db=,app=,client= LOG: aborting startup due to startup process failure
后在pg_resetxlog。和我得到相同的错误(与下一个沃尔文件名)
有什么办法得到这个工作?
答
几天后,我能够得到这个工作。 @Vao Tsun的帮助使我走向正确的方向,但可悲的是没有必要。
如何使用WAL文件恢复Postgres数据库并完成虚拟机备份|恢复:
-
备份:
- [也许创建一个新的Postgres检查点。对我来说这不是必要的,但我的上一个检查点并不太旧;对于检查点而言,没有pg_start_backup()的直接方式]
- 对包含postgres数据库的VM进行简单备份。完整/增量 - >您的选择。 (我在虚拟机运行时这样做)
-
select pg_start_backup('some label')
是不是必要的。
与[也许之前的检查点]
-
只是正常的备份恢复VM:
- 自动完成不启动此VM。您需要确保postgres不会自动启动。如果你有特殊的启动模式,你可以使用live-linux-CD重命名postgres二进制文件或数据目录,或者使用脚本来检查系统是否已经恢复,所以postgres不应该启动。
- 启动虚拟机
- [也许检查pg_log文件,如果禁用postgres的工作。 - >没有新的日志文件]
-
恢复数据库:
- 创建$ PGDATA目录内的recovery.conf:
restore_command = 'cp /[path_to_your_wal_backups]/%f "%p"' recovery_target_timeline = 'latest'
- 开始的Postgres
- 看到pg_log如果恢复沃尔文件工作
- [连接到数据库。并搜索作为最后的测试新资料]
- 创建$ PGDATA目录内的recovery.conf:
答
从你的错误我假设你跳过pg_start_backup
。否则,你should have missing checkpoint:
pg_start_backup接受的 备份任意用户定义的标签。 (通常,这是存储备份转储文件的名称。)在独占模式下使用时,该功能会将 写入备份标签文件(backup_label),并且如果pg_tblspc /目录中有任何链接,一个表空间映射文件(tablespace_map)放入 数据库集群的数据目录中,执行一个检查点,然后 以文本形式返回备份的起始事务日志位置。
按照逻辑顺序应该是这样的:
-
备份:
- 的前一天 - 只是VM副本之前,运行
select pg_start_backup('some label')
(确保它返回的位置 - 可能需要很长时间才能创建保存点,或者强制以IO秒的价格快速创建) - 虚拟机备份
select pg_stop_backup()
- 的前一天 - 只是VM副本之前,运行
-
恢复:
- 我恢复了VM
- 创建的recovery.conf与
restore_command = 'cp /.../%f %p'
- rcpostgresql开始
- 让人们知道它的工作
另外你可能想阅读关于pg_control,chechpoints和恢复序列here。
只要你调用'pg_start_backup()'和'pg_stop_backup()',你的增量备份涵盖了所有的数据库文件,你必须一切从WAL文件pg_start_backup此应该工作。 –