pg_receivewal
pg_receivewal — 从 PostgreSQL 服务器流式接收预写式日志
大纲
pg_receivewal [option...]
描述
pg_receivewal 用于从正在运行的 PostgreSQL 数据库集簇流式接收预写式日志。预写式日志通过流复制协议传输,并写入本地目录中的文件。该目录可作为使用时间点恢复执行恢复时的归档位置(见第 25.3 节)。
pg_receivewal 会在服务器生成预写式日志的同时实时流式接收,而不像 archive_command 那样等待 WAL 段完成。因此,使用 pg_receivewal 时无需设置 archive_timeout。
与 PostgreSQL 备库的 WAL 接收进程不同,pg_receivewal 默认只会在一个 WAL 文件关闭时才将 WAL 数据刷写到磁盘。要实时刷写 WAL 数据,必须指定 --synchronous 选项。由于 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 段文件的开头作为起始位置。
如果无法使用上述方法计算起点,就使用服务器通过
IDENTIFY_SYSTEM命令报告的最新 WAL 刷盘位置。
如果因非致命错误导致连接中断或初次连接无法建立,pg_receivewal 将无限期重试该连接,并尽快重新建立流式传输。要避免这种行为,请使用 -n 参数。
在没有致命错误的情况下,pg_receivewal 会一直运行,直到收到 SIGINT(Control+C)信号为止。
选项
-Ddirectory--directory=directory用于写入输出的目录。
这个参数是必需的。
-Elsn--endpos=lsn当接收位置到达指定 LSN 时,自动停止复制并以正常退出状态 0 退出。
如果存在 LSN 恰好等于
lsn的记录,该记录也会被处理。--if-not-exists当指定
--create-slot且同名槽已存在时,不报错。-n--no-loop遇到连接错误时不要循环重试,而是立即报错退出。
--no-sync此选项会使
pg_receivewal不强制将 WAL 数据刷写到磁盘。这样会更快,但也意味着如果随后发生操作系统崩溃,可能会留下损坏的 WAL 段。一般来说,此选项适合测试,但不应在生产环境中执行 WAL 归档时使用。这个选项与
--synchronous不兼容。-sinterval--status-interval=interval指定向服务器回送状态包的时间间隔(秒)。这样更便于从服务器端监视进度。值为零将完全禁用周期性状态更新,不过在服务器请求时仍会发送更新,以避免因超时而断开连接。默认值是 10 秒。
-Sslotname--slot=slotname要求 pg_receivewal 使用一个现有复制槽(见第 26.2.6 节)。使用此选项时,pg_receivewal 会向服务器报告刷写位置,指示每个段何时已同步到磁盘,以便服务器在该段不再被需要时将其移除。
当服务器将 pg_receivewal 的复制客户端配置为同步备库时,使用复制槽会向服务器报告刷写位置,但只会在一个 WAL 文件关闭时才报告。因此,这种配置会导致主库上的事务长时间等待,实际上无法令人满意地工作。要让这种配置正确工作,还必须另外指定
--synchronous选项(见下文)。--synchronous在收到 WAL 数据后立即将其刷写到磁盘。无论
--status-interval如何,刷写后还会立即向服务器回送状态包。如果服务器将 pg_receivewal 的复制客户端配置为同步备库,则应指定此选项,以确保及时向服务器发送反馈。
-v--verbose启用详细输出模式。
-Zlevel--compress=level启用预写式日志的 gzip 压缩,并指定压缩级别(0 到 9,0 表示不压缩,9 表示最佳压缩)。所有文件名都会自动添加
.gz后缀。
以下命令行选项控制数据库连接参数:
-dconnstr--dbname=connstr以连接字符串的形式指定用于连接到服务器的参数;这些参数会覆盖任何冲突的命令行选项。
为了与其他客户端应用保持一致,该选项被称为
--dbname,但由于 pg_receivewal 并不连接到集簇中的任何特定数据库,连接字符串中的数据库名会被忽略。-hhost--host=host指定运行服务器的主机名。如果该值以斜杠开头,则被用作 Unix 域套接字的目录。默认值取自
PGHOST环境变量(如果已设置),否则尝试 Unix 域套接字连接。-pport--port=port指定服务器正在监听连接的 TCP 端口,或本地 Unix 域套接字文件扩展名。默认值取自
PGPORT环境变量(如果已设置),否则使用编译时的默认值。-Uusername--username=username用于连接的用户名。
-w--no-password绝不提示输入密码。如果服务器要求密码认证,而又无法通过
.pgpass文件等其他方式获得密码,则连接尝试将会失败。此选项可用于批处理作业和脚本,因为这些场景中没有用户在场输入密码。-W--password强制 pg_receivewal 在建立连接前提示输入密码。
这个选项从来都不是必需的,因为如果服务器要求密码认证,pg_receivewal 会自动提示输入密码。不过,pg_receivewal 需要先浪费一次连接尝试,才能发现服务器需要密码。在某些情况下,输入
-W以避免这次额外的连接尝试是值得的。
为了控制物理复制槽,pg_receivewal 可以执行下列两种操作之一:
还可以使用下列其他选项:
退出状态
当因 SIGINT 信号终止时,pg_receivewal 将以状态 0 退出。(这是其正常结束方式,因此不算错误。)对于致命错误或其他信号,退出状态将为非零值。
环境
与大多数其他 PostgreSQL 工具一样,此工具也使用 libpq 支持的环境变量(见第 34.14 节)。
注解
当使用 pg_receivewal 而不是 archive_command 作为主要 WAL 备份方法时,强烈建议使用复制槽。否则,服务器可以在这些预写式日志文件备份完成之前自由回收或删除它们,因为无论是 archive_command 还是复制槽,都不会向服务器提供 WAL 流已经归档到什么位置的信息。不过请注意,如果接收端跟不上获取 WAL 数据的速度,复制槽会占满服务器的磁盘空间。
如果源集簇启用了组权限,pg_receivewal 会在接收到的 WAL 文件上保留这些组权限。
示例
要从位于 mydbserver 的服务器流式接收预写式日志,并将其存储到本地目录 /usr/local/pgsql/archive:
$pg_receivewal -h mydbserver -D /usr/local/pgsql/archive