PostgreSQL 15: pg_basebackup 的压缩控制选项

John Doe 六月 25, 2025

你想在进行基础备份的时候,同时进行打包和压缩吗?

草原上的一头大象

特性提交日志

扩展 pg_basebackup 的压缩控制选项。

--compress选项现支持接收压缩方法及可选压缩级别,语法格式为METHOD[:LEVEL]。当前客户端压缩支持的方法包括 “none” 和 “gzip”。这些方法仅使用整数值表示压缩级别,但未来实现的其他方法可根据需要使用更具体的关键字。

本次提交保持逻辑向后兼容,新的--compress选项格式遵循以下兼容规则:

  • -z/--gzip等同于--compress=gzip
  • --compress=NUM含义如下: 若NUM = 0,则等效于--compress=none。 若NUM > 0,则等效于--compress=gzip:NUM

此外,后续还计划扩展此语法以支持服务端压缩。

讨论:https://postgr.es/m/Yb3GEgWwcu4wZDuA@paquier.xyz

示例

PostgreSQL 的最新版本已经为 pg_basebackup 提供了 gzip 压缩。下面,让我们来进行一次简单的演示。

为了能备份一些数据,我们将使用 pgbench 创建一个小型数据库:

$ psql -c "create database redrock"

$ pgbench -i -s 100 redrock
dropping old tables...
creating tables...
generating data (client-side)...
10000000 of 10000000 tuples (100%) done (elapsed 28.91 s, remaining 0.00 s)
vacuuming...
creating primary keys...
done in 36.32 s (drop tables 0.00 s, create tables 0.02 s, client-side generate 29.17 s, vacuum 0.57 s, primary keys 6.56 s).

让我们使用传统方式,使用 gzip 最高压缩级别来转储它。我们先看看有哪些压缩选项:

$ pg_basebackup --help | grep -A 1 LEVEL
  -Z, --compress={gzip,none}[:LEVEL] or [LEVEL]
                         compress tar output with given compression method or level

目前只有 “none” 和 “gzip”:

$ mkdir /var/tmp/backup
$ pg_basebackup -D /var/tmp/backup/ -Z none
$ ls /var/tmp/backup/
backup_label     base              global        pg_dynshmem  pg_ident.conf  pg_logical    pg_notify    pg_serial     pg_stat      pg_subtrans  pg_twophase  pg_wal   postgresql.auto.conf
backup_manifest  current_logfiles  pg_commit_ts  pg_hba.conf  pg_log         pg_multixact  pg_replslot  pg_snapshots  pg_stat_tmp  pg_tblspc    PG_VERSION   pg_xact  postgresql.conf

$ rm -rf /var/tmp/backup/*
$ pg_basebackup -D /var/tmp/backup/ -F t -Z gzip:4
$ ls -l /var/tmp/backup/
total 3316
-rw------- 1 postgres postgres   138314 Jan 21 08:39 backup_manifest
-rw------- 1 postgres postgres 82357329 Jan 21 08:39 base.tar.gz
-rw------- 1 postgres postgres    17075 Jan 21 08:39 pg_wal.tar.gz

既然已经提供了压缩控制的选项,期待社区后续还会支持其他的压缩方式。

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

参考

提交日志:https://git.postgresql.org/pg/commitdiff/5c649fe153367cdab278738ee4aebbfd158e0546