Postgres 恢复复制,时间线冲突

Postgres 恢复复制,时间线冲突

我有一个带有流复制(主、从配置)的 postgres 数据库(版本 9.4)。我们称主数据库为 A,从数据库为 B。

运行 A 的服务器发生故障,我们不得不进行切换,将 B 提升为新的主服务器。到目前为止,一切正常,运行良好。

现在我已经恢复了损坏的服务器,并想再次设置复制,以便 A 可以成为新的从属服务器。因此,我从 B 中获取备份,将其放在服务器 A 中,设置恢复文件并启动它。这里的问题是它实际上不再起作用,因为它显示它们处于两个不同的时间线上。

以下是来自 A(新从属)的消息:

2015-10-30 14:28:04 LOG:  database system was shut down in recovery at 2015-10-30 14:27:28 CET 
2015-10-30 14:28:04 LOG:  entering standby mode 
2015-10-30 14:28:04 LOG:  redo starts at 1A/5802B1A8 
2015-10-30 14:28:04 LOG:  consistent recovery state reached at 1A/581FA248 
2015-10-30 14:28:04 LOG:  record with zero length at 1A/581FA248 
2015-10-30 14:28:04 LOG:  database system is ready to accept read only connections 
2015-10-30 14:28:05 LOG:  started streaming WAL from primary at 1A/58000000 on timeline 2 
2015-10-30 14:28:07 ERROR:  requested starting point 19/FE000000 on timeline 1 is not in this server's history 
2015-10-30 14:28:07 DETAIL:  This server's history forked from timeline 1 at 19/FDCF9BA0. 
2015-10-30 14:28:12 ERROR:  requested starting point 19/FE000000 on timeline 1 is not in this server's history 
2015-10-30 14:28:12 DETAIL:  This server's history forked from timeline 1 at 19/FDCF9BA0.

我的恢复文件如下:

standby_mode = 'on'
primary_conninfo = 'host=serverB port=5432 user=replication-user'
restore_command = 'copy "Z:\\pg_xlog\\%f" "%p"'
archive_cleanup_command = '"C:\\Program Files\\PostgreSQL\\9.4\\bin\\pg_archivecleanup" "Z:\\pg_xlog" "%r"'
trigger_file = 'Z:\\trigger\\pgsql.trigger.sekasto021'
recovery_target_timeline = 'latest'

谷歌搜索后我发现了几乎相同的问题这里但没有答案。找到了一页来自迈克尔·帕奎尔谁描述了发生在我身上的事情(尽管他说从 9.3 版开始这不是一个问题)。他说:

FATAL:  timeline 2 of the primary does not match recovery target timeline 1

这只能通过从主节点复制 WAL 段或使用 WAL 存档来解决。

但遗憾的是,我不知道他所说的使用 wall 档案从主服务器复制 wal 段是什么意思。

欢迎任何帮助/指导。谢谢

更新:我发布了这个问题在 stackoverflow 上,有人要求将其放在这里

答案1

现在我已经恢复了损坏的服务器,并想再次设置复制,以便 A 可以成为新的从属服务器。因此,我从 B 中获取备份,将其放在服务器 A 中,设置恢复文件并启动它。这里的问题是它实际上不再起作用,因为它显示它们处于两个不同的时间线上。

那么你没有正确地从 B 进行备份。从日志来看,你似乎正在尝试启动旧副本将 A 作为 B 的复制品。这是行不通的。

您必须从 A 中删除/重命名旧数据目录。然后使用它pg_basebackup来制作 B 的新备份。

(还有其他方法 - 请参阅手册 - 但这是最​​简单且最容易正确的方法)。

时间线切换后流复制的问题与您当前的问题无关。

答案2

正如 Craig Ringer 所提到的,我做了一个新的备份并检查,在设置从属服务器后它就可以正常工作了。

但是当我做这些的时候,我还想起还有一台旧服务器,它也是旧主数据库 (A) 的从属服务器(该服务器应该没有运行,这就是我最初没有想到它的原因)。无论如何,在关闭旧从属服务器并再次备份和恢复后,它就正常工作了。

正如我所说,我最初以为这是由于备份不当造成的,但最终却是第三台服务器(第二个从属数据库)产生的错误消息。为了证明我的观点,我启动了旧服务器并再次收到错误消息。

2015-10-31 10:26:37 CET ERROR:  requested starting point 19/FE000000 on timeline 1 is not in this server's history
2015-10-31 10:26:37 CET DETAIL:  This server's history forked from timeline 1 at 19/FDCF9BA0.

因此,看起来复制一直在单独进行,但是第二次复制产生的错误消息让我感到困惑。

再次感谢 Craig 的帮助。

相关内容