Skip to content

pg_receivewal

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

概要

pg_receivewal[选项...]

说明

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

写前日志流的起始点在pg_receivewal启动时计算

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

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

  3. 如果无法使用前一种方法计算起始点,则使用服务器从 IDENTIFY_SYSTEM 命令报告的最新 WAL 刷新位置。

如果连接丢失,或者如果最初无法建立连接,并且出现非致命错误,pg_receivewal将无限期重试连接,并尽快重新建立流。为避免此行为,请使用-n参数。

在没有致命错误的情况下,pg_receivewal将运行,直到被SIGINT(Control+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 使用现有的复制槽(请参阅 第 27.2.6 节)。当使用此选项时,pg_receivewal 将向服务器报告刷新位置,指示每个段已同步到磁盘,以便服务器可以在不需要时删除该段。

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

--synchronous

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

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

-v
--verbose

启用详细模式。

-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

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

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

-h host
--host=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 命令行参数的帮助,然后退出。

退出状态

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

环境

此实用程序与大多数其他PostgreSQL实用程序一样,使用libpq支持的环境变量(请参阅第 34.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