是否可以从 WAL 恢复数据库两次?

Is it possible to restore db from WALs twice?

我有一个主数据库服务器,WALs 定期存档在 s3 上。所以 s3 有一个 'snapshot' 的数据库,其中包含所有相应的最新 WAL。 我有另一个(本地)数据库服务器,我想定期 更新到主数据库服务器的实际状态。 所以我曾经从 s3 复制 "main" 目录并使用 restore.conf 从 s3 应用所有 WAL 我在这个文件中唯一改变的是:

restore_command = 'aws s3 cp s3://%bucketName%/database/pg_wal/%f %p'

成功了。 一段时间后,我想将 s3 中的所有最新 WAL 应用到 "more synchronized" 与主数据库服务器。 是否有可能以某种方式做到这一点? 我很清楚,我没有对我的 "copied" 数据库服务器进行任何更新或写入。当我尝试以 与之前完全相同的方式执行此操作时 我收到下一个错误(来自 stderr):

fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000001000001EF0000001F" does not 
exist
fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000002.history" does not exist
fatal error: An error occurred (404) when calling the HeadObject 
operation: Key "database/pg_wal/00000001.history" does not exist
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden
fatal error: An error occurred (403) when calling the HeadObject 
operation: Forbidden

这是对我的程序更详细的描述:

我在 s3 上有两个目录:basebackuppg_walbasebackup 包含 baseglobalpg_logicalpg_multixactpg_xactPG_VERSIONbackup_label 个文件。

当我第一次恢复它时,我会执行以下操作:

  1. 停止 postgres

  2. aws s3 sync s3://%bucketname%/basebackup ~/10/main

  3. mkdir ~/10/main

  4. 中的空目录
  5. 复制了recovery.conf.sample~/10/main/recovery.conf

  6. 如上编辑recovery.conf

  7. 启动 PostgreSQL

当我在一段时间后再次执行此操作时,我正在执行步骤 1、4、5、6 并获得所描述的结果。

可能,我需要以某种方式指定要恢复的 s3 存储桶中的第一个 WAL?因为我们之前已经恢复了其中的一些。或者根本不可能?

你的程序好像有很多问题:

  • 完整的备份不仅包括上面列出的文件和目录,还包括 完整 数据目录 (pg_wal/pg_xlog可以为空)。

  • 第一次恢复后,PostgreSQL会选择一个新的时间线,重命名backup_labelrecovery.conf并作为常规数据库出现。

    您无法继续恢复此类数据库。我不知道你到底做了什么才能再次进入恢复模式,但你一定是坏了什么。

数据库完成恢复后,进一步恢复的唯一方法是再次恢复初始备份并从头开始恢复。

您是否考虑过 recovery_target_action = 'pause' 使用时间点恢复?然后 PostgreSQL 将保持恢复模式,您可以 运行 查询数据库。要继续恢复,请定义新的恢复目标并重新启动服务器。