2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

pg_receivewal

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

概要

pg_receivewal [选项...]

描述

pg_receivewal 用于从正在运行的 PostgreSQL 集群流式传输预写日志 (WAL)。预写日志使用流复制协议进行流式传输,并写入本地文件目录。该目录可用作进行时间点恢复 (PITR) 的归档位置(参见 第 25.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 权限的用户(参见 第 21.2 节)或超级用户进行,并且 pg_hba.conf 必须允许复制连接。服务器还必须配置 max_wal_senders 设置得足够高,以便为流至少留有一个可用会话。

pg_receivewal 启动时会计算预写日志流的起点。

  1. 首先,扫描写入 WAL 段文件的目录,找到最新的已完成段文件,并将下一个 WAL 段文件的开头作为起点。

  2. 如果无法使用前一种方法计算出起点,并且使用了复制槽,则会发出额外的 READ_REPLICATION_SLOT 命令来检索该槽的 restart_lsn 作为起点。此选项仅在从 PostgreSQL 15 及更高版本流式传输预写日志时可用。

  3. 如果无法使用前一种方法计算出起点,则使用服务器通过 IDENTIFY_SYSTEM 命令报告的最新 WAL flush 位置作为起点。

如果连接丢失,或者无法初步建立连接(非致命错误),pg_receivewal 将无限期地重试连接,并在可能的情况下尽快重新建立流式传输。要避免此行为,请使用 -n 参数。

在没有致命错误的情况下,pg_receivewal 将一直运行,直到被 SIGINTCtrl+C)或 SIGTERM 信号终止。

选项

-D 目录
--directory=目录

输出要写入的目录。

此参数是必需的。

-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 间隔
--status-interval=间隔

指定发送回服务器的状态数据包之间的时间(秒)。这使得从服务器更容易监控进度。值为零会完全禁用周期性状态更新,尽管在服务器请求时仍会发送更新,以避免超时断开连接。默认值为 10 秒。

-S 槽名
--slot=槽名

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

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

--synchronous

在接收到 WAL 数据后立即将其刷新到磁盘。此外,在刷新后立即向服务器发送状态数据包,无论 --status-interval 设置如何。

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

-v
--verbose

启用详细模式。

-Z 级别
-Z 方法[:详情]
--compress=级别
--compress=方法[:详情]

启用预写日志的压缩。

压缩方法可以设置为 gziplz4(如果 PostgreSQL 是使用 --with-lz4 编译的)或 none(不压缩)。可以选择指定压缩详情字符串。如果详情字符串是整数,则指定压缩级别。否则,它应该是逗号分隔的项列表,每个项的形式为 关键字关键字=值。目前,唯一支持的关键字是 level

如果未指定压缩级别,则使用默认压缩级别。如果仅指定了级别而未提及算法,则在级别大于 0 时使用 gzip 压缩,在级别为 0 时不使用压缩。

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

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

-d connstr
--dbname=connstr

指定用于连接服务器的参数,作为连接字符串;这些将覆盖任何冲突的命令行选项。

此选项名为 --dbname,以与其他客户端应用程序保持一致。但由于 pg_receivewal 不连接到集群中的任何特定数据库,因此连接字符串中包含的任何数据库名称都将被服务器忽略。但是,这样提供的数据库名称将覆盖默认数据库名称(replication),以便在 ~/.pgpass 中查找复制连接的密码。同样,用于连接 PostgreSQL 的中间件或代理可能会为此名称用于连接路由等目的。

-h 主机
--host=主机

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

-p 端口
--port=端口

指定服务器正在监听连接的 TCP 端口或本地 Unix 域套接字文件扩展名。默认值为 PGPORT 环境变量(如果已设置),或者编译时默认值。

-U 用户名
--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 命令行参数的帮助,然后退出。

退出状态

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

环境变量

此实用程序与大多数其他 PostgreSQL 实用程序一样,使用 libpq 支持的环境变量(参见 第 32.15 节)。

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

注释

当使用 pg_receivewal 而不是 archive_commandarchive_library 作为主要的 WAL 备份方法时,强烈建议使用复制槽。否则,服务器可以自由地回收或删除预写日志文件,因为它们尚未备份,因为它没有从 archive_commandarchive_library 或复制槽获得任何信息,关于 WAL 流的归档进度。但请注意,如果接收器跟不上 WAL 数据的获取速度,复制槽会填满服务器的磁盘空间。

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

示例

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

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

另请参阅

pg_basebackup

提交更正

如果您在文档中发现任何不正确、不符合您对特定功能的实际经验或需要进一步澄清的内容,请使用 此表单 报告文档问题。