【问题标题】:Postgres restore/update with WAL on cloned VM instead of using basebackupPostgres 在克隆的 VM 上使用 WAL 恢复/更新,而不是使用 basebackup
【发布时间】:2017-05-09 15:49:46
【问题描述】:

环境: 800GB Postgres 数据库(OpenSuse)

正常恢复过程:

  • 您有 pg_basebackup 需要恢复(比如说:每个星期六)
  • 您有从上周六到今天的WAL文件
  • 首先:使用 pg_basebackup 恢复
  • 然后:使用 WAL 文件更新数据库以获得最新数据。 (带有 recovery.conf)

我的想法:
当您每天使用一些备份软件进行增量备份时,为什么每周都要进行大型 pg_basebackup 并通过 Internet 将 800GB 复制到 NAS。

  • 恢复完整的数据库-vm(昨天站着)
  • 添加 WAL 文件(恢复)以使此 vm-clone 保持最新。

现在我已经完成了:

  • 我恢复了一个虚拟机
  • 创建recovery.conf

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

  • rcpostgresql 启动

我收到以下错误:

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 文件名)

有什么办法可以让它工作吗?

【问题讨论】:

  • 只要您调用pg_start_backup()pg_stop_backup(),您的增量备份将覆盖所有数据库文件,并且您拥有从 pg_start_backup 开始的所有 WAL 文件,这应该可以工作。

标签: postgresql backup restore wal


【解决方案1】:

根据您的错误,我假设您跳过了 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. 我恢复了一个虚拟机
    2. 使用restore_command = 'cp /.../%f %p' 创建recovery.conf
    3. rcpostgresql 启动
    4. 让人们知道它是否有效

您还可能想了解 pg_control、检查点和恢复序列 here

【讨论】:

  • 虚拟机的下一次增量备份是今晚。所以我明天去看看。
  • 酷。谢谢你。我与 oracle11 做了非常接近的事情 - 很好奇
【解决方案2】:

几天后,我能够得到这个工作。 @Vao Tsun 的帮助将我带入了正确的方向,但遗憾的是没有必要。

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

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

【讨论】:

    猜你喜欢
    • 2021-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 2016-09-02
    • 2010-09-11
    相关资源
    最近更新 更多