pg_receivewal — 从PostgreSQL服务器流式传输预写式事务日志
pg_receivewal
[选项
...]
pg_receivewal用于从正在运行的PostgreSQL集群流式传输预写式事务日志。使用流复制协议流式传输预写式事务日志,并将其写入文件本地目录。该目录可作为归档位置,用于执行使用时间点恢复来进行的还原(参见第 25.3 节)。
pg_receivewal在服务器上实时流式传输预写式事务日志,就像它在服务器上生成的一样,并不像archive_command和archive_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时,计算预写日志流式传输的起始点
首先,扫描写入 WAL 段文件所在的目录,并查找最新的已完成段文件,将下一个 WAL 段文件的开始作为起始点。
如果无法使用上一方法计算出起始点,并且如果使用的是复制槽,则会发出一个额外的READ_REPLICATION_SLOT
命令,以检索槽的restart_lsn
以用作起始点。仅当从PostgreSQL 15 及更高版本流式传输预写日志时,才可用此选项。
如果无法使用上一方法计算出起始点,则使用服务器通过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
]
启用预写式日志的压缩。
压缩方法可以设置为 gzip
、lz4
(若 PostgreSQL 使用 --with-lz4
编译)或 none
以不进行任何压缩。还可以选择指定压缩细节字符串。若细节字符串为整数,则它指定压缩级别。否则,它应为逗号分隔的项目列表,每个项目均为 keyword
或 keyword=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 命令行参数的帮助信息,然后退出。
当 SIGINT 或 SIGTERM 信号终止 pg_receivewal 时,其将以 0 状态退出。(这是结束它的正常方式。因此这并非错误。)对于致命错误或其他信号,退出状态将为非零。
此实用程序与大多数其他 PostgreSQL 实用程序一样,都使用 libpq 支持的环境变量(参见 第 32.15 部分)。
环境变量 PG_COLOR
指定是否在诊断消息中使用颜色。可能的值包括 always
、auto
和 never
。
在使用 pg_receivewal 代替 archive_command 或 archive_library 作为主要的 WAL 备份方法时,强烈建议使用复制槽。否则,服务器可在先期未完成备份的情况下随意回收或删除预先写入日志文件,因为它不具有任何有关 WAL 流已存档到什么程度的信息(无论来自 archive_command、archive_library 还是复制槽)。但是请注意,如果接收者未及时抓取 WAL 数据,复制槽将填满服务器的磁盘空间。
如果源群集上启用了组权限,pg_receivewal 将保留接收到的 WAL 文件上的组权限。
从服务器流式传输预先写入日志 mydbserver
,并将其存储在本地目录 /usr/local/pgsql/archive
中
$
pg_receivewal -h mydbserver -D /usr/local/pgsql/archive