Redrock Postgres 搜索 英文
版本: 10 / 11 / 12 / 13 / 14 / 15 / 16 / 17

pg_receivewal

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

概要

pg_receivewal [选项...]

描述

pg_receivewal用于从正在运行的PostgreSQL集群流式传输预写式事务日志。使用流复制协议流式传输预写式事务日志,并将其写入文件本地目录。该目录可作为归档位置,用于执行使用时间点恢复来进行的还原(参见第 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 刷新位置。

如果连接丢失,或者如果在初始建立时出现了非致命错误,则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 interval
--status-interval=interval

指定回传到服务器的状态数据包之间的秒数。这可以更轻松地从服务器监测进度。值 0 完全禁用定期状态更新,尽管仍会在服务器发出请求时发送更新,以避免超时断开连接。默认值为 10 秒。

-S slotname
--slot=slotname

要求 pg_receivewal 使用现有的复制槽(请参阅 第 26.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 不会连接到集群中的任何特定数据库,因此服务器将忽略在连接字符串中包含的所有数据库名称。但是,以这种方式提供的数据库名称将覆盖默认数据库名称 (replication),以在 ~/.pgpass 中查找复制连接的密码。类似地,用于连接到 PostgreSQL 的中间件或代理可能会利用该名称用于诸如连接路由之类的目的。

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

退出状态

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

环境

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

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

备注

在使用 pg_receivewal 代替 archive_commandarchive_library 作为主要的 WAL 备份方法时,强烈建议使用复制槽。否则,服务器可在先期未完成备份的情况下随意回收或删除预先写入日志文件,因为它不具有任何有关 WAL 流已存档到什么程度的信息(无论来自 archive_commandarchive_library 还是复制槽)。但是请注意,如果接收者未及时抓取 WAL 数据,复制槽将填满服务器的磁盘空间。

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

示例

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

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

另请参阅

pg_basebackup