PostgreSQL 15: pg_basebackup 支持备份目标

John Doe 六月 17, 2025

你想要将基础备份直接发送到目标存储上吗?

草原上的一头大象

特性提交日志

支持基础备份目标。

pg_basebackup 现在新增了--target=TARGET[:DETAIL]选项。若指定该选项,它会作为 BASE_BACKUP 命令中 TARGET 选项的值发送至服务器。如果包含 DETAIL 部分,则会作为新的 TARGET_DETAIL 选项的值发送至服务器。若目标不是 ‘client’,pg_basebackup 会假定服务器将负责把备份写入目标所定义的位置,因此本地无需写入任何内容。不过,服务器仍会向客户端发送消息用于进度报告。

在服务器端,现在支持两种额外的备份目标类型:

  • blackhole 目标:简单地丢弃掉备份数据而不进行任何处理。显然,此目标仅适用于测试和调试场景,因为运行完成后不会实际生成备份。
  • server 目标:更实用的是,现在可通过类似pg_basebackup -Xnone -t server:/SOME/PATH的命令,将备份写入服务器上的指定位置。未来可扩展支持更多目标类型,甚至可能考虑创建扩展机制以添加新目标类型。

由于 WAL 的提取由独立的客户端逻辑处理,因此不属于此机制的一部分。因此,使用非默认目标的备份必须搭配-Xnone-Xfetch选项。

讨论:http://postgr.es/m/CA+TgmoaYZbz0=Yk797aOJwkGJC-LK3iXn+wzzMx7KdwNpZhS5g@mail.gmail.com

示例

到目前为止,pg_basebackup 会始终将结果发送到启动它的节点/机器。这意味着:如果您在客户端或备份机器上启动了 pg_basebackup,那么生成的基础备份将发送到那里。在 PostgreSQL 的最新版本中,开始有了其他的可用选项。

如果我们在客户端上启动基础备份,会发生什么情况?数据将从数据库服务器发送到客户端,并且会将基础备份本地存储在客户端上:

$ mkdir /var/tmp/backup
$ pg_basebackup -h 192.168.100.241 -F t -D /var/tmp/backup/
$ ls -l /var/tmp/backup/
total 39624
-rw------- 1 postgres postgres   138469 May 21 07:41 backup_manifest
-rw------- 1 postgres postgres 23652864 May 21 07:41 base.tar
-rw------- 1 postgres postgres 16778752 May 21 07:41 pg_wal.tar

上面介绍了可以让服务器存储备份。该选项如下:

$ pg_basebackup --help | grep -A 1 TARGET
  -t, --target=TARGET[:DETAIL]
                         backup target (if other than client)

所以现在,再次从客户端执行 pg_basebackup,我们可以这样做:

$ ssh 192.168.100.241 'mkdir /var/tmp/bb'
$ pg_basebackup -h 192.168.100.241 -X none -t server:/var/tmp/bb/
$ ssh 192.168.100.241 'ls -l /var/tmp/bb/'
total 23236
-rw------- 1 postgres postgres   138469 May 21 07:57 backup_manifest
-rw------- 1 postgres postgres 23654400 May 21 07:57 base.tar

现在,备份已在服务器上生成,无需发送到客户端。为了测试目的,我们还提供了“blackhole”目标,该目标会直接丢弃备份:

$ pg_basebackup -h 192.168.100.241 -X none -t blackhole

为什么这个特性很有意义?因为现在有了实现其他备份目标的基础能力,比如 S3 存储或其他备份目标。

非常不错的特性。感谢社区的所有相关人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/3500ccc39b0dadd1068a03938e4b8ff562587ccc