如何触发PostgreSQL热备用WAL文件恢复?

时间:2016-11-21 11:03:37

标签: postgresql database-replication wal

主服务器

# 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无误地执行此操作。如何配置以使其真正只读?

2 个答案:

答案 0 :(得分:2)

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

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

备用数据库目录中的backup_label文件包含哪些内容?如果该文件不存在,那可能就是问题。

备用设备突然停止工作还是从未工作过? 你究竟是如何创建备用数据库的?

答案 1 :(得分:1)

您必须首先从主服务器的低级基本备份创建备用服务器。您无法创建新实例并使用pg_dumppg_restore。我猜这就是你想要做的事。

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

pg_basebackup -X stream -D standby_datadir_location -h master_ip

或类似。

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

如果要进行存档恢复,则应将restore_command添加到备用数据库recovery.conf,以便将存档从存档位置复制到备用数据库。

the manual已涵盖所有内容。