最近在学习 openGauss 学习备份的时候用到了gs_probackup,某厂对gs_probackup修改了不少东西,支持企业版增量 PTRACK模式 备份,还是可以的。秉承着知其然知其所以然,来学习下pg_probackup吧。
pg_probackup 是 Postgres Professional 开源的 PostgreSQL 物理备份工具,类似 pg_basebackup的增强版,支持增量备份、并行、压缩、校验、PITR、异地恢复等企业级特性。
对比 | pg_basebackup | pg_probackup |
备份类型 | 仅全量 | 全量 + 增量(page/delta/ptrack-企业版) |
并行 | 有限 | 多进程并行 |
压缩 | 基础 | zlib/lz4/zstd |
备份校验 | 无 | 页级校验 + CRC |
保留策略 | 无 | 冗余数/时间窗口 |
异地恢复 | 手动 | 内置支持 |
性能 | 一般 | 大库优势明显 |
一、部署
1.1 安装
su - postgres
tar -zxvf /soft/pg_probackup-2.5.16.tar.gz -C /home/postgres/soft/postgresql-17.10/contrib/
cd /home/postgres/soft/postgresql-17.10/contrib/pg_probackup-2.5.16/
make && make install
1.2 查看
pg_probackup -V
which pg_probackup
1.3 创建备份账号
非postgres管理员账号,需创建流复制备份用户(PG10+)
权限参考官网:https://postgrespro.com/docs/postgrespro/17/app-pgprobackup
For Postgres Pro versions 11 — 14:
BEGIN;
CREATE ROLE backup WITH LOGIN REPLICATION PASSWORD 'backup';
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_start_backup(text, boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_stop_backup(boolean, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
-- CREATE ROLE backup WITH LOGIN REPLICATION;
ALTER USER backup WITH REPLICATION;For Postgres Pro 15 or higher:
BEGIN;
CREATE ROLE backup WITH LOGIN;
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
-- CREATE ROLE backup WITH LOGIN REPLICATION;
ALTER USER backup WITH REPLICATION;postgres@localhost pg_probackup-2.5.16]$ psql
psql (17.10)
Type "help" for help.
postgres=# BEGIN;
CREATE ROLE backup WITH LOGIN;
GRANT USAGE ON SCHEMA pg_catalog TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.current_setting(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.set_config(text, text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_is_in_recovery() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_start(text, boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_backup_stop(boolean) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_create_restore_point(text) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_switch_wal() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_last_wal_replay_lsn() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_current_snapshot() TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.txid_snapshot_xmax(txid_snapshot) TO backup;
GRANT EXECUTE ON FUNCTION pg_catalog.pg_control_checkpoint() TO backup;
COMMIT;
-- CREATE ROLE backup WITH LOGIN REPLICATION;
ALTER USER backup WITH REPLICATION;
BEGIN
CREATE ROLE
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
GRANT
COMMIT
ALTER ROLE
postgres=#
二、配置与初始化
2.1 配置归档
pg_probackup 支持archive-push 归档,我们直接配置上
-- PostgreSQL 配置
max_wal_senders = 10
data_checksums = on
wal_keep_size = 1GB
wal_level = replica
archive_mode = on
archive_command = 'pg_probackup archive-push -B /data/backup --instance cluster17 --wal-file-path=%p --wal-file-name=%f'
记得重启数据库哦!
2.2 初始化备份目录
pg_probackup init -B /data/backup
2.3 注册实例
pg_probackup add-instance -B /data/backup \
--instance cluster17 \
-D /data/pgdata \
--pguser backup
2.4 设置保留策略、已经备份参数
pg_probackup set-config -B /data/backup/ -D /data/pgdata --instance cluster17 \
--log-level-console=INFO --log-level-file=INFO --log-filename=pg_probackup-%a.log \
--error-log-filename=pg_probackup_error-%a.log --log-directory=/data/backup/logs \
--log-rotation-size=0 --log-rotation-age=1d --compress-algorithm=zlib --compress-level=5 \
--retention-redundancy=2 --retention-window=2 --archive-timeout=30min
重点参数:
参数 | 含义 | 说明 |
| 保留最近 N 个全量备份(含其下增量) | 如 |
| 保留能满足 N 天内 PITR 恢复所需的最早全备及后续备份 | 如 |
同时设置时 | 两个条件取并集,谁要求保留更多就按谁来 |
例如:
# 保留最近 7 个备份
--retention-redundancy=7
# 或保留 30 天
--retention-window=302.5 这里记得打开下数据页校验和
如果你初始化的时候就设置 --data-checksums 方式初始化,这里就不用了,
这个需要重启,如果数据库已经在跑了,数据库上百G的话还是需要点时间的。
pg_checksums --enable -D /data/pgdata/
启用后,PostgreSQL 会对每个数据页(8KB)计算一个 CRC32 校验和,写入页头。
之后每次读取数据页时,PG 会校验:
- 磁盘静默损坏(bit rot)
- 存储层 silently corrupted data
- 部分 RAID / FS 层面的数据错误
发现损坏会直接报错:
ERROR: invalid page checksum三、备份
3.1 全量备份 0
FULL模式:全量备份会将数据库集下所有的数据文件进行备份
pg_probackup backup -B /data/backup --instance cluster17 -b full --stream -U backup
3.2 增量备份
支持三种不同模式(PAGE,DELTA,PTRACK),增量备份一般选择PAGE模式
(1)DELTA模式 :pg_probackup 会扫描所有的数据目录文件,然后将上一次备份后发生改变的数据页进行拷贝备份。IO消耗基本等同于全量备份。
(2) PAGE模式 :pg_probackup仅会扫描备份上一次备份结束时刻之后的所有WAL归档日志,读取日志中数据页的变更。这种模式下的增量备份必须配置持续归档(wal_level > minimal 、archive_mode = on/always、archive_command 归档到备份实例的wal目录下或使用 pg_probackup 进行 archive-push 归档)
(3) PTRACK模式 :pg_probackup 会实时跟踪源备份实例端数据页的变化,对于距上一次备份后发生更新的数据页,将其记录在 bitmap 中,以此来加快增量备份的时间。该模式下不需要关注WAL日志归档的设置,增量备份时间相对于DELTA更快,但是由于需要实时跟踪发生变化的数据页,所以对源端数据库服务器是有一定的资源消耗的。仅支持postgre pro standard和postgre pro Enterprise。
(4)gs_probackup(GaussDB / openGauss)通常只支持 FULL + PTRACK 模式,不支持 PAGE / DELTA。
1)PAGE 模式(最常用)
WAL 必须完整归档且可用,否则 PAGE 增量备份会失败或退化为全量
pg_probackup backup -B /data/backup --instance cluster17 -b page --stream -U backup
2)delta 模式
IO 消耗接近全备,不需要 WAL 归档
pg_probackup backup -B /data/backup --instance cluster17 -b delta --stream -U backup
3)PTRACK 模式
可以看到不支持这种增量模式
pg_probackup backup -B /data/backup --instance cluster17 -b PTRACK --stream -U backup
3.3 查看备份
pg_probackup show -B /data/backup
3.4 删除备份
1、删除错误备份:
pg_probackup delete -B /data/backup --instance=cluster17 --status=ERROR
2、删除指定备份集合
pg_probackup delete -B /data/backup --instance=cluster17 -i THEDLX
3.5 备份校验
# 执行备份校验,--检测pg实例checksum
pg_probackup checkdb --backup-path=/data/backup \
--instance cluster17 \
--pgdata=/data/pgdata \
--pguser=backup \
--pgdatabase=postgres \
--pgport=6244
3.6 详细备份信息
pg_probackup show -B /data/backup --instance cluster17 --format=json -i THEDK1[postgres@localhost pgdata]$ pg_probackup show -B /data/backup --instance cluster17 --format=json -i THEDK1
[
{
"instance": "cluster17",
"backups": [
{
"id": "THEDK1",
"parent-backup-id": "THEDFE",
"backup-mode": "PAGE",
"wal": "STREAM",
"compress-alg": "zlib",
"compress-level": 5,
"from-replica": "false",
"block-size": 8192,
"xlog-block-size": 8192,
"checksum-version": 1,
"program-version": "2.5.16",
"server-version": "17",
"current-tli": 1,
"parent-tli": 0,
"start-lsn": "0/6000028",
"stop-lsn": "0/70000B8",
"start-time": "2026-06-29 22:28:49+08",
"end-time": "2026-06-29 22:28:57+08",
"recovery-xid": 752,
"recovery-time": "2026-06-29 22:28:51+08",
"data-bytes": 118076,
"wal-bytes": 50331648,
"uncompressed-bytes": 158028,
"pgdata-bytes": 23453732,
"primary_conninfo": "user=backup channel_binding=prefer host=/data/pgdata port=6244 sslmode=prefer sslnegotiation=postgres sslcompression=0 sslcertmode=allow sslsni=1 ssl_min_protocol_version=TLSv1.2 gssencmode=disable krbsrvname=postgres gssdelegation=0 target_session_attrs=any load_balance_hosts=disable",
"status": "OK",
"content-crc": 2839959165
}
]
}
]3.7 查看WAL档案信息
pg_probackup show -B /data/backup --instance=cluster17 --archive
3.8 增量合并
g_probackup 的 merge 操作通过向下合并增量链,将分散的增量备份数据聚合到全量备份中。
指定对象 | 合并范围 |
全量备份 | 该全量 + 紧随其后的首个增量 |
增量备份 | 该增量 + 其所有祖先增量 → 直至父级全量 |
pg_probackup merge -B /data/backup --instance cluster17 -i THEDK1
3.9 备份集可用性检测
pg_probackup validate -B /data/backup --instance cluster17
pg_probackup validate -B /data/backup --instance cluster17 --backup-id=THEDK1
pg_probackup validate -B /data/backup --instance cluster17 --recovery-target-time='2026-06-29 22:28:51+08'
3.10 定期清理备份和归档
# 清理过期备份 + WAL
pg_probackup delete -B /data/backup \
--instance cluster17 \
--delete-expired \
--delete-wal把 --delete-expired --delete-wal挂到备份命令上,每次新备份完成后自动清过期数据:

四、恢复
4.1 一、恢复到最新备份的一致性点(不前滚 WAL)
即恢复到备份完成时的状态:
pg_probackup restore -B /data/backup --instance cluster17 -D /data/rd1不指定 -i→ 自动选最新 OK 状态的备份(全量+增量自动合并还原)
默认 --recovery-target=immediate,恢复到备份 STOP LSN 即停


4.2 恢复到【最新备份 + 已归档/流式 WAL 的最新状态】(PITR 到最新)
把归档里所有可用 WAL 都应用完,恢复到崩溃前最后一刻:
pg_probackup restore -B /data/backup --instance cluster17 \
-D /data/rd2 \
--recovery-target=latest--recovery-target=latest→ 一直前滚到 WAL 仓库/archive 里最后一个段,并自动设 --recovery-target-timeline=latest

4.3 PITR 恢复到指定时间点
pg_probackup restore -B /data/backup \
--instance cluster17 \
-D /data/rd3 \
--recovery-target-time="2026-06-29 22:28:51" \
--recovery-target-action=promote
五、备份方案设计
5.1 推荐备份策略
项目 | 配置 |
全量频率 | 每周一次(周日) |
增量频率 | 每天一次(周一~周六) |
保留份数 | 最近 7 份全量 |
保留天数 | 30 天 |
压缩算法 | zlib level 5 |
并行度 | CPU 核数 × 2 |
5.2 配置定时任务
mkdir -p /data/backup/script
vi probackup.sh#!/bin/bash
# /etc/cron.d/pg_backup
BACKUP_DIR=/data/backup
INSTANCE=cluster17
DATE=$(date +%w) # 0=周日
# 周日全量,其余 PAGE 增量
if [ "$DATE" -eq 0 ]; then
MODE="full"
else
MODE="page"
fi
pg_probackup backup -B $BACKUP_DIR \
--instance $INSTANCE \
-b $MODE \
--stream \
-U backup \
-j 8 \
--compress-algorithm=zlib \
--compress-level=5 >> /data/backup/logs/pg_probackup.log 2>&15.3 测试
chmod +x probackup.sh
sh probackup.sh

5.4 定时任务
设置 非 root 用户执行任务
vi /etc/cron.allow
postgres设置定时任务
crontab -e
0 2 * * * /data/backup/script/probackup.sh
六、最后
本来想试下 pg_probackup 配置s3 存储的,发现不支持,增备PTRACK 模式也不支持 ,不太行啊!pg_probackup 社区版不支持 s3,得上Postgres Pro Enterprise。
几个版本对比:
版本 | S3 原生支持 | PTRACK | 说明 |
pg_probackup 社区版(GitHub) | ❌ 不支持 | ❌ | 只能备份到本地目录或 s3fs 挂载 |
pg_probackup Enterprise / pg_probackup3 | ✅ 支持 | ✅ | Postgres Pro Enterprise 附带 |
gs_probackup(openGauss) | ✅ 有 | ✅ PTRACK | 华为分支,参数写法不同 |




