有两台服务器。一台是现场数据库服务器;另一台是异地备份服务器。由于现场数据库服务器已经包含近 900G 的数据,因此备份非常重要。最初,我们使用每日备份pg_dumpall
,但出于性能原因,这不再是一种选择。
由于数据库服务器即将升级,包括 postgresql 本身的升级(从 postgresql 9.1 升级到 9.4),我决定尝试将 WAL 传输转移到异地服务器,以便备份可以正常工作。以下是我目前所做的:
- 在新服务器上创建新集群
- 停止新服务器上的数据库服务器,将数据目录 rsync 到异地服务器(这样我就有一个基础备份)
- 在新服务器上配置 postgresql.conf,使其
wal_level
设置为hot_standby
、和。archive_mode
on
archive_command
test ! -f /srv/pg_wal/%f && cp %p /srv/pg_wal/%f
- 在新服务器上启动集群
ssh oldserver pg_dumpall | psql
读取数据,生成大量 WAL 段- 通过较慢的链接(速度介于 1 到 6Mbit 之间,具体取决于一天中的时间)将 WAL 段复制到异地服务器。这需要几天时间
restore.conf
在异地服务器的数据目录中创建包含restore_command = 'cp /srv/pg_wal/%f "%p"'
和standby_mode = on
。- 在异地服务器上启动 postgresql
- 意识到它应该是
recovery.conf
,所以再次停止服务器并将文件移动到正确的名称。
不幸的是,它似乎不起作用。当我现在查看日志文件时,我看到以下内容:
2016-07-25 12:30:59 CEST [137390-71] LOG: record with zero length at 0/2000200
2016-07-25 12:31:04 CEST [137390-72] LOG: restored log file "000000010000000000000002" from archive
2016-07-25 12:31:04 CEST [137390-73] LOG: record with zero length at 0/2000200
2016-07-25 12:31:09 CEST [137390-74] LOG: restored log file "000000010000000000000002" from archive
这种情况一再重复。
检查pg_xlog
异地服务器上的目录发现有两个文件:一个是000000010000000000000002
,其校验和与 中的同名文件相同/srv/pg_wal
;另一个是 ...03,但校验和不同。
我的/srv/pg_wal
包含所有 WAL 段,也包括000000010000000000000001
(原始数据库服务器创建的第一个段)。但是,我似乎无法将它们加载到异地服务器中。
问题:在给定的情况下,我能否以某种方式让异地服务器仍然接受这些 WAL 日志?如果可以,我该怎么做?
从技术上讲,我可以创建一个新的基础备份并将其复制到新服务器,但由于现在服务器上已经有大量数据,并且两个站点之间的带宽较低,如果可以避免的话,我宁愿不这样做。