主服务器
# 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
问题:
只需将主服务器中的/archive/*
复制到备用服务器中的$PGDATA/pg_xlog
,就可以将数据同步到备用服务器吗?
如何以及何时在热备用服务器中触发WAL文件的恢复?备用服务器是否定期检查其$PGDATA/pg_xlog
目录中是否有新的WAL文件?或者我是否必须手动触发?
我说的是热备用,而不是流式复制;所以我假设我不必配置conninfo
。我是对的吗?
配置hot_standby = on
并重新启动服务器后,我仍然可以INSERT
无误地执行此操作。如何配置以使其真正只读?
答案 0 :(得分:2)
这看起来很像你没有正确初始化备用数据库。
日志文件指出PostgreSQL甚至不会开始复制,因为它无法找到有效的检查点。
备用数据库目录中的backup_label
文件包含哪些内容?如果该文件不存在,那可能就是问题。
备用设备突然停止工作还是从未工作过? 你究竟是如何创建备用数据库的?
答案 1 :(得分:1)
您必须首先从主服务器的低级基本备份创建备用服务器。您无法创建新实例并使用pg_dump
和pg_restore
。我猜这就是你想要做的事。
执行合适的基本备份的最简单方法是使用pg_basebackup
。手册中讨论了其他选项,但实际上,只需使用:
pg_basebackup -X stream -D standby_datadir_location -h master_ip
或类似。
只有拥有有效的基本备份后,才能启动存档恢复或流式复制。最简单的方法是启用流复制。让pg_basebackup
通过传递-R
标志为您做到这一点。
如果要进行存档恢复,则应将restore_command
添加到备用数据库recovery.conf
,以便将存档从存档位置复制到备用数据库。
the manual已涵盖所有内容。