Postgres pg_rewind不适用于简单的用例

时间:2018-08-03 02:46:21

标签: postgresql

我们一直在努力使pr_rewind正常工作。无奈之下,我们一直在尝试使用例尽可能简单

我们有两个数据库服务器,它们以正常的“主/备用”配置在两台不同的计算机上运行Postgres 10。

两台机器都将其WAL存档日志写入同一共享驱动器(称为/ ice_dev / wal_archive)。 该配置具有以下条款

archive_mode = always
archive_command = 'test ! -f /ice-dev/wal_archive/%f && cp %p /ice-dev/wal_archive/%f'
full_page_writes = on
wal_log_hints = on        

启用校验和

我们在计算机A和B上运行的过程如下:

  1. 在A和B上构建新数据库,并将A配置为主数据库,将B配置为备用数据库。
  2. 对A(主数据库)进行一些更改,并检查它们是否已复制到B(备用数据库)
  3. 促进B成为新的主要
  4. 关闭A(原始主电源)
  5. 将复制插槽添加到B(新的主数据库)中,以使A(即将成为备用数据库)
  6. 将recovery.conf添加到A(即将成为备用数据库)。文件包含

    recovery_target_timeline = 'latest' and restore_command = 'cp /ice-dev/wal_archive/%f "%p"
    
  7. 在A上运行pg_rewind –它似乎可以正常工作,因为它返回消息“源集群和目标集群位于同一时间线上,无需回绕” ;
  8. 启动服务器A(现在是从服务器)

此时,A处于只读模式,但未复制。它的日志包含以下重复消息

2018-08-01 20:30:58 UTC [7257]: [1] user=,db=,app=,client= FATAL:  could not start WAL streaming: ERROR:  requested starting point 0/6000000 on timeline 1 is not in this server's history
    DETAIL:  This server's history forked from timeline 1 at 0/57639D0.
cp: cannot stat ‘/ice-dev/wal_archive/00000002.history’: No such file or directory
cp: cannot stat ‘/ice-dev/wal_archive/00000003.history’: No such file or directory
cp: cannot stat ‘/ice-dev/wal_archive/00000002.history’: No such file or directory
2018-08-01 20:30:58 UTC [6840]: [48] user=,db=,app=,client= LOG:  new timeline 2 forked off current database system timeline 1 before current recovery point 0/6000098
cp: cannot stat ‘/ice-dev/wal_archive/000000010000000000000006’: No such file or directory

我们可以在B的wal目录中看到00000002.history文件…..但它永远不会出现在wal_archive目录中-即使我们发出结帐甚至重启服务器也没有。

00000003.history在两台计算机上似乎都不存在。

任何想法我们在做什么错了吗?

谢谢。理查德

1 个答案:

答案 0 :(得分:0)

我目前正在调查类似的问题,这是我在PostgreSQL official docs中发现的内容:

  

通常,恢复将在所有可用的WAL段中进行,从而将数据库还原到当前时间点(或在可用的WAL段中尽可能接近)。 因此,正常恢复将以“找不到文件”消息结束,错误消息的确切文本取决于您选择的restore_command。 您还可能在恢复开始时看到名为00000001.history之类的文件的错误消息。这也是正常现象,在简单的恢复情况下并不表示有问题;参见Section 25.3.5进行讨论。

因此,可能的答案是-您做对了所有事情,这是设计好的行为,但是时间表可能也有问题:

  

恢复的默认行为是按照进行基本备份时的当前时间线进行恢复。如果希望恢复到某个子时间轴(即,要返回到尝试恢复后本身生成的某种状态),则需要在recovery.conf中指定目标时间轴ID。您无法恢复到比基本备份更早分支的时间表。

因此,您可以尝试在recovery.conf中明确指定时间轴ID。

此外,我建议您最好在https://dba.stackexchange.com/进行提问,因为您可以在那里进一步关注针对DBA的特定问题。