的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。和我得到相同的错误(与下一个沃尔文件名)

有什么办法得到这个工作?

+0

只要你调用'pg_start_backup()'和'pg_stop_backup()',你的增量备份涵盖了所有的数据库文件,你必须一切从WAL文件pg_start_backup此应该工作。 –

几天后,我能够得到这个工作。 @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如果恢复沃尔文件工作
    • [连接到数据库。并搜索作为最后的测试新资料]

从你的错误我假设你跳过pg_start_backup。否则,你should have missing checkpoint

pg_start_backup接受的 备份任意用户定义的标签。 (通常,这是存储备份转储文件的名称。)在独占模式下使用时,该功能会将 写入备份标签文件(backup_label),并且如果pg_tblspc /目录中有任何链接,一个表空间映射文件(tablespace_map)放入 数据库集群的数据目录中,执行一个检查点,然后 以文本形式返回备份的起始事务日志位置。

按照逻辑顺序应该是这样的:

  • 备份

    1. 的前一天 - 只是VM副本之前,运行select pg_start_backup('some label')(确保它返回的位置 - 可能需要很长时间才能创建保存点,或者强制以IO秒的价格快速创建)
    2. 虚拟机备份
    3. select pg_stop_backup()
  • 恢复
    1. 我恢复了VM
    2. 创建的recovery.conf与restore_command = 'cp /.../%f %p'
    3. rcpostgresql开始
    4. 让人们知道它的工作

另外你可能想阅读关于pg_control,chechpoints和恢复序列here

+0

谢谢。我今天会检查它。 – LisaS

+0

vm的下一次增量备份是今晚。所以我明天会检查它。 – LisaS

+0

很酷。谢谢。我用oracle11做了非常接近的事情 - 非常好奇 –