Postgresql 中文操作指南
Description
pg_receivewal 用于从正在运行的 PostgreSQL 集群流式传输预写式日志。预写式日志使用流式复制协议进行流式传输,并写入本地文件目录。此目录可用作用于执行恢复的归档位置,并使用当时恢复(请参阅 Section 26.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 权限(请参阅 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__]_
-
启用预写日志的压缩。
-
压缩方法可设置为 gzip 、 lz4 (如果 PostgreSQL 已使用 —​with-lz4 进行编译)或 none (不进行压缩)。还可以选择指定压缩详细说明字符串。如果详细说明字符串为整数,则指定压缩等级。否则,它应为逗号分隔的项列表,每个项的格式为 keyword 或 keyword=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 指定是否在诊断消息中使用颜色。可能的值是 always 、 auto 和 never 。
Notes
在使用 pg_receivewal 代替 archive_command 或 archive_library 作为主 WAL 备份方法时,强烈建议使用复制槽。否则,由于服务器没有任何来自 archive_command 或 archive_library 或复制槽的信息,在未备份的情况下,服务器可以自由回收或删除预写日志文件,表明 WAL 流已经存档到何处。但是,请注意,如果接收方跟不上提取 WAL 数据的进度,复制槽将会填满服务器的磁盘空间。
如果源集群启用了组权限,pg_receivewal 将保留接收的 WAL 文件上的组权限。
Examples
从 mydbserver 服务器传输预写日志并将其存储在本地目录 /usr/local/pgsql/archive 中:
$ pg_receivewal -h mydbserver -D /usr/local/pgsql/archive