暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

PostgreSQL 物理备份实战:pg_probackup 全量/增量/PITR 完整指南

原创 黄山谷 21小时前
22



最近在学习 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

重点参数:

参数

含义

说明

--retention-redundancy=N

保留最近 N 个全量备份(含其下增量)

3= 至少留 3 个全备

--retention-window=N

保留能满足 N 天内 PITR 恢复所需的最早全备及后续备份

30= 可恢复到 30 天前任意时间点

同时设置时

两个条件取并集,谁要求保留更多就按谁来

例如:

# 保留最近 7 个备份
   --retention-redundancy=7
 
 # 或保留 30 天
   --retention-window=30

2.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>&1

5.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

✅ 支持 --s3

Postgres Pro Enterprise 附带

gs_probackup(openGauss)

✅ 有 --media-type=s3

✅ PTRACK

华为分支,参数写法不同


「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论