pg_receivewal

pg_receivewal —来自 PostgreSQL 服务器的流预写日志

Synopsis

pg_receivewal [ option ...]

Description

pg_receivewal 用于流式传输来自运行中的 PostgreSQL 集群的预写日志。使用流复制协议对预写日志进行流处理,并将其写入文件的本地目录。该目录可以用作使用时间点恢复进行还原的存档位置(请参见Section 25.3)。

pg_receivewal 和在服务器上生成的一样,实时流式传输预写日志,并且不像archive_command那样 await 段完成。因此,在使用 pg_receivewal 时不必设置archive_timeout

与 PostgreSQL 备用服务器的 WAL 接收器不同,默认情况下 pg_receivewal 仅在关闭 WAL 文件时才刷新 WAL 数据。必须指定选项--synchronous以实时刷新 WAL 数据。由于 pg_receivewal 不适用 WAL,因此当synchronous_commit等于remote_apply时,您不应允许它成为同步备用数据库。如果是这样,它将看起来像一个永远不会追上的备用数据库,并且将导致事务提交被阻塞。为了避免这种情况,您应该为synchronous_standby_names配置一个适当的值,或者为与之不匹配的 pg_receivewal 指定application_name,或者将synchronous_commit的值更改为remote_apply以外的值。

预写日志通过常规 PostgreSQL 连接流式传输,并使用复制协议。必须与超级用户或具有REPLICATION权限的用户(请参阅Section 21.2)构建连接,并且pg_hba.conf必须允许复制连接。还必须将服务器的max_wal_senders设置得足够高,以使流至少有一个会话可用。

如果连接丢失或无法初始构建,并且发生非致命错误,则 pg_receivewal 将无限期重试连接,并尽快重新构建流。若要避免此行为,请使用-n参数。

在没有致命错误的情况下,pg_receivewal 将运行直到被 SIGINTsignal( Control C )终止。

Options

  • -D directory
    --directory=directory

    • 将输出写入的目录。

此参数是必需的。

  • -E lsn
    --endpos=lsn

    • 当接收到达指定的 LSN 时,自动停止复制并以正常退出状态 0 退出。

如果存在 LSN 等于* lsn *的记录,则将处理该记录。

  • --if-not-exists

    • 指定--create-slot并且具有指定名称的插槽已存在时,请不要出错。
  • -n
    --no-loop

    • 不要循环连接错误。相反,请立即退出并出现错误。
  • --no-sync

    • 此选项使pg_receivewal不强制将 WAL 数据刷新到磁盘。这更快,但是意味着随后的 os 崩溃可能会使 WAL 段损坏。通常,此选项对于测试很有用,但在生产部署上进行 WAL 归档时不应使用。

此选项与--synchronous不兼容。

  • -s interval
    --status-interval=interval

    • 指定状态包发送回服务器之间的秒数。这样可以更轻松地监视来自服务器的进度。零值将完全禁用定期状态更新,尽管在服务器请求时仍将发送更新,以避免超时断开连接。默认值为 10 秒。
  • -S slotname
    --slot=slotname

    • 要求 pg_receivewal 使用现有的复制插槽(请参见Section 26.2.6)。使用此选项时,pg_receivewal 将向服务器报告刷新位置,指示何时每个段都已同步到磁盘,以便服务器可以删除该段(如果不需要)。

当在服务器上将 pg_receivewal 的复制 Client 端配置为同步备用服务器时,则使用复制插槽将向服务器报告刷新位置,但仅当 WAL 文件关闭时才如此。因此,该配置将导致主数据库上的事务 await 很长时间,并且实际上无法令人满意地工作。为了使此功能正常运行,还必须指定选项--synchronous(请参见下文)。

  • --synchronous

    • 收到 WAL 数据后立即将其刷新到磁盘。刷新后,无论--status-interval怎样,都应立即将状态包发送回服务器。

如果在服务器上将 pg_receivewal 的复制 Client 端配置为同步备用服务器,则应指定此选项,以确保及时将反馈发送到服务器。

  • -v
    --verbose

    • 启用详细模式。
  • -Z level
    --compress=level

    • 启用 gzip 压缩预写日志,并指定压缩级别(0 至 9,0 为无压缩,9 为最佳压缩)。后缀.gz将自动添加到所有文件名中。

以下命令行选项控制数据库连接参数。

  • -d connstr
    --dbname=connstr

    • 指定用于连接到服务器的参数,作为连接字符串。有关更多信息,请参见Section 34.1.1

为了与其他 Client 端应用程序保持一致,该选项称为--dbname,但是由于 pg_receivewal 没有连接到集群中的任何特定数据库,因此连接字符串中的数据库名称将被忽略。

  • -h host
    --host=host

    • 指定运行服务器的计算机的主机名。如果该值以斜杠开头,则将其用作 Unix 域套接字的目录。默认值来自PGHOST环境变量(如果已设置),否则尝试 Unix 域套接字连接。
  • -p port
    --port=port

    • 指定服务器正在侦听连接的 TCP 端口或本地 Unix 域套接字文件 extensions。默认值是PGPORT环境变量(如果已设置)或已编译的默认值。
  • -U username
    --username=username

    • 连接的用户名。
  • -w
    --no-password

    • 切勿发出密码提示。如果服务器要求密码验证,而其他方式(例如.pgpass文件)无法使用密码,则连接尝试将失败。该选项在没有用户 Importing 密码的批处理作业和脚本中很有用。
  • -W
    --password

    • 强制 pg_receivewal 在连接数据库之前提示 Importing 密码。

这个选项从来都不是必须的,因为如果服务器要求密码认证,pg_receivewal 将自动提示 Importing 密码。但是,pg_receivewal 将浪费连接尝试,以发现服务器需要密码。在某些情况下,值得 Importing-W以避免额外的连接尝试。

pg_receivewal 可以执行以下两个操作之一来控制物理复制插槽:

  • --create-slot

    • 使用--slot中指定的名称创建一个新的物理复制插槽,然后退出。
  • --drop-slot

    • 使用--slot中指定的名称删除复制插槽,然后退出。

其他选项也可用:

  • -V
    --version

    • 打印 pg_receivewal 版本并退出。
  • -?
    --help

    • 显示有关 pg_receivewal 命令行参数的帮助,然后退出。

Exit Status

当被 SIGINTsignal 终止时,pg_receivewal 将以状态 0 退出。 (这是结束它的正常方法.因此,这不是错误.)对于致命错误或其他 signal,退出状态将为非零。

Environment

与大多数其他 PostgreSQLUtil 一样,该 Util 使用 libpq 支持的环境变量(请参见Section 34.14)。

Notes

当使用 pg_receivewal 而不是archive_command作为主要的 WAL 备份方法时,强烈建议使用复制插槽。否则,服务器可以在备份前自由回收或删除预写日志文件,因为它没有来自archive_command或复制插槽的有关 WAL 流已存储多远的任何信息。但是请注意,如果接收方跟不上 WAL 数据的获取,复制槽将填满服务器的磁盘空间。

如果在源集群上启用了组权限,pg_receivewal 将保留接收到的 WAL 文件的组权限。

Examples

要从位于mydbserver的服务器流式传输预写日志并将其存储在本地目录/usr/local/pgsql/archive中:

$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive

See Also

pg_basebackup