我有一个带有流复制(主、从配置)的 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 的帮助。