我正在使用 PostgreSQL 9.1 和流复制进行故障转移以及使用 WAL 进行归档。
如果我archive_command
在备用服务器上使用配置指令,它将始终失败(因为它尝试存档的 WAL 段已由主服务器存档),因此我archive_command
在备用服务器上使用一个空的。
问题是当我的主服务器关闭并且备用服务器成为新的主服务器时,存档会停止。有没有办法在 archive_command 脚本中知道服务器是否在主模式下运行?
我可以编写一个archive_command
脚本,如果我尝试存档的段名文件已存在则返回 0,但我不确定这是否是正确的行为archive_command
。
答案1
你的直觉是正确的——某种程度上。
编写一个存档命令,确定本地 Postgres 服务器当前是否是主服务器(简单方法:连接并执行SELECT pg_is_in_recovery();
- 如果为真,则您处于从属服务器上)。
如果检测到您位于主服务器上,则正常存档段。
如果检测到您位于从属服务器上,则不执行任何操作并正常退出。
上述技巧之所以有效,是因为您无法连接到处于(崩溃)恢复模式的主服务器——您唯一能够连接到处于恢复模式的 Postgres 服务器的时间是当您连接到具有流式复制的从服务器时。
故障转移后,您的从服务器将成为主服务器(并且不再处于恢复模式),因此您的 WAL 归档脚本将能够执行其工作。
答案2
一切正常:备用服务器上的 PostgreSQL 正在恢复模式下运行,因此 WAL 操作被禁用。