1

主服务器

# postgresql.conf
wal_level = hot_standby
archive_mode = on
archive_timeout = 10
archive_command = 'test ! -f /archive/%f && cp %p /archive/%f'

备用服务器

hot_standby = on

我将主服务器复制/archive/*到备用服务器,$PGDATA/pg_xlog但没有任何反应。当我重新启动备用服务器时,我从服务器日志中收到错误消息:

2016-11-21 17:56:09 CST [17762-3] LOG:  invalid primary checkpoint record
2016-11-21 17:56:09 CST [17762-4] LOG:  record with zero length at 0/6000100
2016-11-21 17:56:09 CST [17762-5] LOG:  invalid secondary checkpoint record
2016-11-21 17:56:09 CST [17762-6] PANIC:  could not locate a valid checkpoint record
2016-11-21 17:56:09 CST [17761-1] LOG:  startup process (PID 17762) was terminated by signal 6: Aborted
2016-11-21 17:56:09 CST [17761-2] LOG:  aborting startup due to startup process failure

问题:

  1. /archive/*只需将主服务器复制到备用服务器就足以将数据同步到备用服务器$PGDATA/pg_xlog吗?

  2. 如何以及何时在热备用服务器中触发 WAL 文件的恢复?备用服务器是否定期检查其$PGDATA/pg_xlog目录是否有新的 WAL 文件?还是我必须手动触发它?

  3. 我说的是热备份,而不是流复制;所以我假设我不必配置conninfo. 我对吗?

  4. 配置hot_standby = on并重新启动服务器后,我仍然可以毫无错误地进行操作INSERT。如何配置使其真正只读?

4

2 回答 2

3

这看起来很像您没有正确初始化备用数据库。

日志文件指出 PostgreSQL 甚至不会开始复制,因为它找不到有效的检查点开始。

backup_label备用数据目录中的文件包含什么?如果该文件不存在,那可能就是问题所在。

那个待机突然停止工作还是从来没有工作过?您究竟是如何创建备用的?

于 2016-11-21T12:03:55.217 回答
2

您必须首先从主服务器的低级基本备份创建备用服务器。您不能创建新实例并使用pg_dumpand pg_restore。我猜这就是你试图做的。

进行合适的基本备份的最简单方法是使用pg_basebackup. 手册中讨论了其他选项,但实际上,只需使用:

pg_basebackup -X stream -D standby_datadir_location -h master_ip

或类似的。

只有拥有有效的基础备份后,您才能开始存档恢复或流式复制。最简单的方法是启用流式复制。让我们pg_basebackup通过传递-R旗帜为您做到这一点。

如果您想要存档恢复,您应该添加一个restore_command到备用数据库recovery.conf,将存档从存档位置复制到备用数据库。

这一切都包含在手册中。

于 2016-11-21T12:54:42.400 回答