pg_receivexlog能为我们做什么呢?它能够从一个PG服务器,获取你想要的那些xlog日志文件。初步研究后,我们可以得到以下信息:

  1. 它以类似流式复制(streaming replication)的方式,获取主库的xlog文件。这意味着你要以超级用户或有replication权限的用户,连接PG进行日志传输,且要在pg_hba.conf里面,对其做权限配置。在连接建立后,PG服务器会有一个独立的WAL sender进程,负责xlog的传输,所以要至少为1,使我们能获得一个WAL sender。
  2. 可以使用replication slot,通过同步replication slot的方式进行日志传输。这样做的好处是,主库在xlog传输完成前不会删除xlog文件。不过可能的风险是,如果日志没有利用slot成功传输,可能导致日志堆积在PG里面,最终把磁盘占满。

PG安装后的bin目录里面,一般包含了pg_receivexlog这个工具。可以使用下面的方式启动它:

有个问题是,如何指定要传输哪些xlog文件?先来看看pg_receivexlog如何确定从哪个xlog文件开始传输的。从src/bin/pg_basebackup/pg_receivexlog.c 的FindStreamingStart函数可以看出,pg_receivexlog会扫描整个-D选项指定的目录,将扫描到的每个文件名,去掉其timeline部分,转换为64为整数。选取其中对应整数最大的文件,按如下方式选择开始下载的文件:如果这个文件是以.partial为后缀的,则重新下载此文件和后续文件;如果该文件不带.partial后缀,是一个完整的日志文件,则从此文件的下一个文件(文件名加1)开始下载。如果我们需要从00000001000000000000001B到00000001000000000000001D的几个文件,则只需要在-D指定的目录里面执行:

保证此目录没有其他文件,然后按上面列出的方式启动pg_receivexlog即可,pg_receivexlog会重新下载00000001000000000000001B和后续文件。

注意,pg_receivexlog只在成功传输完一个xlog文件后,才检查是否收到了SIGINT信号,因此你只可能在一个文件接收完成后正常结束pg_receivexlog运行。其实更暴力的办法是直接kill -9 也是可以的。

从上面的分析可以看出,pg_receivexlog这个工具还是比较简单易用的。除了传输xlog日志,可以利用它做一个日志服务器,用来存储归档的日志;还可以做为一主多备方案。由此可见,pg_receivexlog既是一个很实用的工具,也是一个可以用于更多场景的让人充满想象的利器。