由 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