我刚刚在postgres中设置了stream式复制(9.3.5),而stream式传输正如我所期望的那样工作,我正努力让我的备用数据库运行archive_command,这样我就可以存储所有的日志文件。
硕士postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 max_wal_senders = 4 wal_keep_segments = 8
备用postgres.conf:
wal_level = hot_standby checkpoint_segments = 8 archive_mode = on archive_command = 'test ! -f /backup/postgres_archive/constant/%f && cp %p /backup/postgres_archive/constant/%f' max_wal_senders = 3 wal_keep_segments = 8 hot_standby = on
备用recovery.conf:
standby_mode = 'on' primary_conninfo = 'host=my-host.example.com port=5432 user=replicator password=my_password sslmode=require' restore_command = 'cp /backup/postgres_archive/constant/%f %p' trigger_file = '/tmp/postgresql.trigger'
我正在尝试写入的文件夹的权限是正确的,而且当用户postgres正在运行时手动运行它时,archive_command正常工作。 可以肯定的是,我尝试将存档命令更改为简单的触摸(再次,testing罚款作为postgres用户),但没有任何区别。
我的数据库还处于初期阶段,所以没有太多的负担。 为此,我只是通过将随机数据写入testing表来模拟它。 在我对主人做出承诺之后,我可以看到待机状态下的变化,所以我很高兴。
有一件事情我不太明白,WAL文件是备用的,主服务器稍有不同,但是它几乎看起来好像某个供应商还没有开始写入WAL(这不是在另一)。 这是正常的吗?
如果我在主服务器上select pg_switch_xlog() ,然后再写一些主服务器和备用服务器似乎切换,并开始写入下一个/相同的WAL文件。 这反映了我对发生的事情的理解。
我有几个关于这一切的问题。 我已经通读了postgres手册的每一页,但我无法find任何帮助。
我试图find一些方法让postgres向我展示更多关于它可能在/不在日志文件中做什么的信息,但它没有提供任何有用的东西。 在debugging这个时候,我应该在configuration中改变什么来尽可能多的获取有用的信息?
就日志归档运行的时间而言,我想是因为主控者在控制哪个WAL文件处于活动状态,这实际上是日志传送应该在备用数据库上运行的触发器。 那是对的吗?
stream式复制似乎工作正如我所料,但试图让待机日志传送运行似乎甚至尝试。 我究竟做错了什么?
我也遇到了这个问题。 这里的关键实际上是备用服务器上的“recovery.conf”中的archive_cleanup_command 。 备用数据库在完成从主数据库处理WAL数据块的操作后会运行archive_cleanup_command命令,因此,在这一点上,您知道可以备份该WAL数据段以及之前的所有数据段。 在我的“recovery.conf”中我有:
archive_cleanup_command = '/var/lib/postgresql/wal_backup_mirror.sh "%r"'
该脚本的内容是(简化版):
CURRENT_WAL_FILE="$1" for WAL_FILE in $(find /pg_logs/main -maxdepth 1 -type f | sort | awk "\$0 <= \"/pg_logs/main/${CURRENT_WAL_FILE}\""); do WAL_NAME=$(basename "$WAL_FILE") gzip -c "$WAL_FILE" > "/backups/wal/${WAL_NAME}.gz" #now upload the just created .gz to S3 or some other offsite storage rm -f "${WAL_FILE}" done
请注意,在备份后删除WAL段以保持我的日志目录在备用数据库上保持干净,但是有一点需要注意级联复制设置,因为更靠后的备用数据库可能仍然需要这些设置文件。
最后要注意的是,记住备份WAL段是不够的,必须结合某种常规的完全备份(pg_basebackup)来完成。 我们每天都进行完整备份,然后根据需要全天备份WAL段。