在克隆的VM上使用WAL恢复/更新Postgres而不是使用basebackup

时间:2017-05-09 15:49:46

标签: postgresql backup restore wal

环境: 800GB Postgres-Database(OpenSuse)

正常还原 - 处理:

  • 你要恢复pg_basebackup(从让我们说:每个星期六)
  • 您上周六至今天有 WAL 文件
  • 首先:使用pg_basebackup恢复
  • 然后:使用 WAL -files更新数据库以获取最新数据。 (使用recovery.conf)

我的想法:
为什么每周都有大量的pg_basebackup并通过Internet将800GB拷贝到NAS上,当你每天使用一些备份软件进行增量备份时。

  • 恢复完整的数据库-vm(昨天站)
  • 添加WAL文件(还原)以使此vm-clone更新。

现在我已经完成了:

  • 我恢复了vm
  • 创建recovery.conf

    restore_command =' cp /.../%f% p'

  • rcpostgresql start

我收到以下错误:

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 之后,恢复了下一个WAL文件。我得到同样的错误(下一个wal文件名)

有没有办法让这个工作?

2 个答案:

答案 0 :(得分:0)

根据您的错误我假设您跳过了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. VM备份
    3. select pg_stop_backup()
  • 恢复
    1. 我恢复了vm
    2. 使用restore_command = 'cp /.../%f %p'
    3. 创建recovery.conf
    4. rcpostgresql start
    5. 让人们知道它是否有效

你也可能想读一下pg_control,chechpoints和恢复序列here

答案 1 :(得分:0)

几天后,我能够开始工作。 @Vao Tsun的帮助让我走向正确的方向,但遗憾的是没有必要。

如何使用WAL文件恢复Postgres数据库并完成VM备份还原

  • 备份
    • [也许创建一个新的postgres检查点。对我来说没有必要,但我的最后一个检查点不是太老了;对于检查点,有一种没有pg_start_backup()]
    • 的直接方法
    • 对包含postgres-database的VM进行简单备份。完整/增量 - &gt;你的选择。 (我在VM运行时执行此操作)
    • select pg_start_backup('some label') 必要 只是正常备份[可能是之前的检查点]
  • 恢复VM:
    • 自动启动此VM。您需要确保 postgres不会自动启动。你可以使用特殊启动模式执行此操作,如果你有,使用live-linux-CD重命名postgres二进制文件或数据目录,或者有一个脚本,检查系统是否已恢复,以便postgres不应该启动。
    • 启动虚拟机
    • [也许检查pg_log-File如果禁用postgres工作。 - &GT;没有新的日志文件]
  • 恢复数据库
    • 在$ pgdata目录中创建recovery.conf:
      restore_command = 'cp /[path_to_your_wal_backups]/%f "%p"' recovery_target_timeline = 'latest'
    • start postgres
    • 如果还原wal文件,请参阅pg_log
    • [连接数据库。并作为最后一次测试搜索新数据]