Postgresql 中文操作指南

pg_receivewal

pg_receivewal —— 从 PostgreSQL 服务器流式传输预写式日志

Synopsis

pg_receivewal [ option …​]

Description

pg_receivewal 用于从正在运行的 PostgreSQL 集群流式传输预写式日志。预写式日志使用流式复制协议进行流式传输,并写入本地文件目录。此目录可用作用于执行恢复的归档位置,并使用当时恢复(请参阅 Section 26.3 )。

pg_receivewal 实时流式传输预写式日志,就像在服务器上生成日志一样,并且不会像 archive_commandarchive_library 那样等待段完成。出于此原因,在使用 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 22.2 )或超级用户的用户建立连接,并且 pg_hba.conf 必须允许复制连接。服务器还必须配置 max_wal_senders ,将其设置为足够高以使至少有一个会话可用于流。

pg_receivewal 开始时会计算预写日志流式传输的起点:

如果连接丢失,或者连接无法以非致命性错误初始化,pg_receivewal 将无限期地重试连接,并且在可行时立即重新建立流式传输。如需避免此类行为,请使用 -n 参数。

在没有致命性错误的情况下,pg_receivewal 将运行,直至被 SIGINT ( Control + C ) 或 SIGTERM 信号终止。

Options

  • -D _directory—​directory=_directory

    • 写入输的目录。

    • This parameter is required.

  • -E _lsn—​endpos=_lsn

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

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

  • —​if-not-exists

    • 在指定了 —​create-slot 并且具有指定名称的槽已经存在的情况下,不产生错误。

  • -n_—​no-loop_

    • 在连接错误时不要循环。而是立即退出并返回错误。

  • —​no-sync

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

    • 此选项与 —​synchronous 不兼容。

  • -s _interval—​status-interval=_interval

    • 指定发送回服务器的状态数据包之间的时间(秒)。这能让更加轻松地监视服务器的进程。若值为零,则完全禁用定期状态更新,但当服务器请求时,仍会发送更新,以避免因超时而断开连接。默认值为 10 秒。

  • -S _slotname—​slot=_slotname

    • 要求 pg_receivewal 使用现有的复制槽(参见 Section 27.2.6 )。当使用此选项时,pg_receivewal 会向服务器报告一个刷新位置,指示每个段已同步到磁盘,以便服务器在不再需要该段时删除它。

    • 当服务器上配置 pg_receivewal 的复制客户端为同步备用时,使用复制槽会向服务器报告刷新位置,但仅在 WAL 文件关闭时报告。因此,此配置会使主服务器上的事务等待很长时间,并且实际上无法正常工作。必须另外指定选项 —​synchronous (见下文)才能正确实现此功能。

  • —​synchronous

    • 在接收 WAL 数据后立即将其刷新到磁盘。还将在刷新后立即向服务器发送状态数据包,而不考虑 —​status-interval

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

  • -v_—​verbose_

    • Enables verbose mode.

  • -Z _level-Z _method[:_detail_]—​compress=_level—​compress=_method[:_detail__]_

    • 启用预写日志的压缩。

    • 压缩方法可设置为 gziplz4 (如果 PostgreSQL 已使用 —​with-lz4 进行编译)或 none (不进行压缩)。还可以选择指定压缩详细说明字符串。如果详细说明字符串为整数,则指定压缩等级。否则,它应为逗号分隔的项列表,每个项的格式为 keywordkeyword=value 。当前,唯一受支持的关键字是 level

    • 如果未指定压缩级别,则将使用默认压缩级别。如果在不提及其算法的情况下仅指定了级别,则如果此级别大于 0,将使用 gzip 压缩,如果级别为 0,则不使用压缩。

    • 使用 gzip 时,后缀 .gz 将自动添加到所有文件名,使用 lz4 时将添加后缀 .lz4

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

  • -d _connstr—​dbname=_connstr

    • 指定连接到服务器时使用的参数,作为 connection string ;这些参数将覆盖任何冲突的命令行选项。

    • 此选项被称为 —​dbname ,以便与其他客户端应用保持一致,但由于 pg_receivewal 不会连接到集群中的任何特定数据库,因此连接字符串中的数据库名称将被忽略。

  • -h _host—​host=_host

    • 指定服务器运行所在机器的主机名。如果该值以斜线开头,则将其用作 Unix 域套接字的目录。如果没有设置,则默认从 PGHOST 环境变量中获取,否则尝试建立 Unix 域套接字连接。

  • -p _port—​port=_port

    • 指定服务器侦听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。如果没有设置,则默认为 PGPORT 环境变量,或编译时默认值。

  • -U _username—​username=_username

    • 连接时的用户名。

  • -w_—​no-password_

    • 永不发出密码提示。如果服务器需要密码验证但其他方法(如 .pgpass 文件)无法提供密码,连接尝试将失败。此选项可在无人执行密码输入的批处理作业和脚本中使用。

  • -W_—​password_

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

    • 此选项从来都不是必需品,因为如果服务器要求密码验证,pg_receivewal 将自动提示输入密码。然而,pg_receivewal 为了找出服务器需要密码,会浪费一次连接尝试。在某些情况下,值得输入 -W 以避免额外的连接尝试。

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

  • —​create-slot

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

  • —​drop-slot

    • 删除 —​slot 中指定名称的复制槽,然后退出。

还可以使用其他选项:

  • -V_—​version_

    • 打印 pg_receivewal 版本,然后退出。

  • -?_—​help_

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

Exit Status

pg_receivewal 在 SIGINT 或 SIGTERM 信号终止时将退出,状态为 0。(这是结束它的正常方式。因此它不是错误。)对于致命错误或其他信号,退出状态将为非零。

Environment

此实用工具与大多数其他 PostgreSQL 实用工具类似,它使用 libpq 所支持的环境变量(请参阅 Section 34.15 )。

环境变量 PG_COLOR 指定是否在诊断消息中使用颜色。可能的值是 alwaysautonever

Notes

在使用 pg_receivewal 代替 archive_commandarchive_library 作为主 WAL 备份方法时,强烈建议使用复制槽。否则,由于服务器没有任何来自 archive_commandarchive_library 或复制槽的信息,在未备份的情况下,服务器可以自由回收或删除预写日志文件,表明 WAL 流已经存档到何处。但是,请注意,如果接收方跟不上提取 WAL 数据的进度,复制槽将会填满服务器的磁盘空间。

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

Examples

mydbserver 服务器传输预写日志并将其存储在本地目录 /usr/local/pgsql/archive 中:

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

See Also