我有一个主数据库服务器,WAL定期在s3上存档。因此,s3具有数据库的“快照”以及所有相应的最新WAL。我要定期设置另一个(本地)数据库服务器更新为实际到主数据库服务器的状态。因此,我曾经从s3复制“主”目录,并通过使用restore.conf应用了s3的所有WAL。我对此文件所做的唯一更改是:
restore_command = 'aws s3 cp s3://%bucketName%/database/pg_wal/%f %p'
成功。一段时间后,我想将s3中的所有最新WAL应用于与主数据库服务器“更同步”。 是否可能以某种方式做到这一点?我确切地知道,我没有对“复制的”数据库服务器进行任何更新或写入。当我尝试以与以前完全相同的方式进行操作时,出现下一个错误(来自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上有两个目录:basebackup
和pg_wal
。 basebackup
包含base
,global
,pg_logical
,pg_multixact
,pg_xact
,PG_VERSION
,backup_label
文件。
第一次恢复时,请执行以下操作:
停止postgres
aws s3 sync s3://%bucketname%/basebackup ~/10/main
[mkdir
~/10/main
中的空目录
将recovery.conf.sample
复制到~/10/main/recovery.conf
编辑recovery.conf
如上所述
start PostgreSQL
[一段时间后再次执行此操作时,我将执行步骤1、4、5、6,并获得描述的结果。
可能是,我需要以某种方式指定从s3存储桶到要还原的第一个WAL?因为我们之前已经恢复了其中一些。还是根本不可能?
您的程序似乎有很多错误:
完整备份不仅包含上面列出的文件和目录,还包含complete数据目录(pg_wal
/ pg_xlog
可以为空)。
第一次恢复后,PostgreSQL将选择一个新的时间轴,重命名backup_label
和recovery.conf
并作为常规数据库出现。
您无法继续恢复这样的数据库。我不知道您究竟要怎么做才能再次进入恢复模式,但是您一定已经损坏了某些东西。
一旦数据库完成恢复,唯一进一步恢复的方法就是再次恢复初始备份并从头开始恢复。
您是否考虑过将时间点恢复与recovery_target_action = 'pause'
一起使用?然后,PostgreSQL将保持恢复模式,您可以对数据库运行查询。要继续恢复,请定义新的恢复目标并重新启动服务器。