pg_receivewal 是一个核心工具,用于在 WAL 文件更改写入时将其存档(包括 .partial WAL 文件)。
pg_receivewal 作为 pg_receivexlog 在 PostgreSQL 9.2 中首次引入。
用法
虽然它可以作为独立工具运行,但 pg_receivewal 通常用作更全面的备份和归档解决方案的一部分,例如 Barman,后者使用 pg_receivewal(通常与复制槽结合使用)来最大化从 PostgreSQL 接收到的 WAL 数据量,从而最大限度地减少潜在的数据丢失。
注意事项
WAL 文件将从 pg_receivewal 启动的时间点开始归档,即使源服务器上存在更早的 WAL 文件。
如果指定的归档目录中存在 WAL 文件,pg_receivewal 将假定这些文件来自之前的调用,并等待新的 WAL 可用后再恢复归档。然而,由于无法确定 WAL 是否来自同一服务器,如果目录包含来自其他源的 WAL,这可能会导致存档的 WAL 文件集实际上已损坏。
变更历史
- PostgreSQL 17
- PostgreSQL 16
- 像
SIGINT一样处理SIGTERM(提交 8b60db77)
- 像
- PostgreSQL 15
- PostgreSQL 11
- PostgreSQL 10
- PostgreSQL 9.5
- PostgreSQL 9.4
- 添加了选项
-S/--slot(提交 858ec118)
- 添加了选项
- PostgreSQL 9.3
- PostgreSQL 9.2
- 已添加(提交 d9bae531)
源代码
pg_receivewal 是作为 pg_basebackup 的一部分构建的,因为它实际上是 pg_basebackup 中为支持备份期间流式传输 WAL 文件而添加的功能的前端接口。
pg_receivewal 二进制文件的主要源文件是 src/bin/pg_basebackup/pg_receivewal.c;实际功能的大部分包含在 src/bin/pg_basebackup/receivelog.c 中。
示例
pg_receivewal 的非常基本的使用方法
pg_receivewal -d 'host=node1 dbname=postgres user=repuser' -D /data/wal
请注意,该进程不会自行后台运行或守护。
这将导致存档的 WAL 文件存储在指定的目录中,例如:
$ ls -1 /data/wal 000000010000000000000003 000000010000000000000004 000000010000000000000005 000000010000000000000006 000000010000000000000007 000000010000000000000008 000000010000000000000009.partial
如果上述进程终止(例如使用 Ctrl-C),它可能会输出类似如下的消息:
pg_receivewal: not renaming "000000010000000000000009.partial", segment is not complete
参考资料
- PostgreSQL 文档: pg_receivewal
有用链接
- 使用 pg_receivewal 永不丢失 PostgreSQL 事务 - CyberTec 的 2019 年 10 月博客文章
