postgresql增量备份系列二 pg_probackup

已经很久没有发文章了,主要是最近工作上的内容都不适合发文章公开。可能往后文章发表也不这么频繁了,不过大家有问题我们可以交流。之前有写过PG增量备份的其他工具使用方法,pg_probackup也是应用比较多的PG备份工具。

一. pg_probackup


pg_probackup 是一个用于管理 PostgreSQL 数据库集群备份与恢复的实用工具,截止2.5.15版本,支持 PostgreSQL 11-16 及以上版本。它能够执行定期备份,并在故障发生时帮助恢复服务器。

pg_probackup实用程序基于pg_arman,它最初由NTT编写,然后由Michael Paquier开发和维护。

作为 PostgreSQL 官方扩展工具之一,pg_probackup 相比其他备份方案具备以下优势:


🔁 多样化增量备份模式

支持三种增量备份方式:

DELTA 模式:读取整个数据目录,仅复制变更页,减少写入量。
PAGE 模式:基于 WAL 分析提取变更页,节省空间,但依赖完整归档。
PTRACK 模式:通过 PostgreSQL 内建的 page tracking 位图追踪变更,速度最快,对系统性能影响最小。


🚀 快速恢复

增量恢复(Incremental Restore):跳过未变更的页,提高恢复效率。
部分恢复(Partial Restore):可选择仅恢复某个数据库,而非整个集群。
Catchup 功能:用于让落后的 Standby 节点快速追上主节点。


✅ 验证与一致性检查

自动校验(Validation):备份过程中进行数据一致性检查,支持离线验证。
实例验证(Verification):通过 checkdb 命令对 PostgreSQL 实例进行完整性验证。


📦 高效的存储与空间管理

压缩(Compression):备份数据支持压缩,节省磁盘空间。
去重(Deduplication):自动排除未变化的非数据页(如 _vm_fsm)。
备份保留策略(Retention Policy)

支持基于时间点(recovery window)或保留备份数量。
可配置 TTL(生命周期)来控制备份过期。
过期备份支持自动合并或删除。


⚙️ 高性能执行与并发支持

所有核心操作(如备份、恢复、校验、删除等)均支持多线程并行处理,大幅提升性能。


🌐 远程与灵活备份源支持

支持远程 PostgreSQL 实例的备份与恢复,无需在本地操作。
可从 Standby 节点 执行备份,减轻主节点负载。
可备份 PGDATA 之外的目录(如配置文件、脚本、日志、SQL 文件等)。


📁 集中备份目录与元数据管理

使用统一的 Backup Catalog 管理多个 PostgreSQL 实例的备份与 WAL。
提供 JSON 或纯文本格式 的备份/归档信息,便于脚本调用和可视化集成。


🛡️ 强一致性保障

所有备份均为 物理在线备份,确保数据一致性。支持两种 WAL 捕获方式:

ARCHIVE 模式:依赖持续 WAL 归档进行恢复(默认模式)。
STREAM 模式:通过复制协议实时抓取 WAL,形成自治型(standalone)备份,适用于未启用归档的环境。

pg_probackup 使用的前置要求

限制 描述
支持的 PostgreSQL 版本 pg_probackup 仅支持 PostgreSQL 9.5 及更高版本。
Windows 系统的限制 Windows 系统不支持远程模式。
PostgreSQL 11 的备份要求 在 Unix 系统上,对于 PostgreSQL 11,备份只能由启动 PostgreSQL 服务器的同一个操作系统用户执行。例如,如果 PostgreSQL 由用户 postgres 启动,则备份命令也必须由用户 postgres 执行。在使用 SSH 远程模式时,必须设置 --remote-user 选项为 postgres
PostgreSQL 9.5 的备份要求 对于 PostgreSQL 9.5,函数 pg_create_restore_point(text)pg_switch_xlog() 只有当备份角色是超级用户时才能执行。因此,使用非超级用户角色备份流量较少的集群时,备份可能会比使用超级用户角色时更慢。
备份与恢复服务器的兼容性 从 PostgreSQL 服务器中获取的备份与被恢复的服务器必须在 block_sizewal_block_size 参数上兼容,并且必须具有相同的主版本号。根据集群配置,PostgreSQL 本身可能会施加额外的限制,如 CPU 架构或 libc/icu 版本等。

安装部署

通过github下载其pg_probackup源码包
执行源码编译安装。需要可读取pg_config指令。

su - postgres  ## 使用postgres用户 避免其他用户安装破环目录权限问题
 
tar -zxvf pg_probackup-2.5.15.tar.gz 
cd pg_probackup-2.5.15/
make USE_PGXS=1 PG_CONFIG=/home/postgres/pg/bin/pg_config  top_srcdir=/home/postgres/postgresql-16.3
make USE_PGXS=1 PG_CONFIG=/home/postgres/pg/bin/pg_config  top_srcdir=/home/postgres/postgresql-16.3  install 


## top_srcdir 参数指定得是YODB的源码包位置
## USE_PGXS=1 使用 PGXS 外部扩展构建模式

创建初始化目录适用独立得目录为其备份

#创建备份目录
mkdir -p   /home/postgres/backup
##初始化备份目录(pg_probackup会自动创建对应得backups、wal的分类文件夹)
  /home/postgres/pg/bin/pg_probackup init -B /home/postgres/backup  -U backup -d backupdb 
--remote-host=10.0.0.138 
   --remote-user=postgres

##增加备份示例
  /home/postgres/pg/bin/pg_probackup add-instance -B  /home/postgres/backup  -D $PGDATA --instance=test -U backup -d backupdb

## $PGDATA 是指定被备份得示例得数据目录地址

 ## 如果远程备份,需要配置SHH相关得免密通信。
 /home/postgres/pg/bin/pg_probackup add-instance -B  /home/postgres/backup -D $PGDATA 
   --instance=test 
   -U backup -d backupdb   
   --remote-host=10.0.0.138 
   --remote-user=postgres

PG在15以后将pg_start_backup(text, boolean, boolean)、pg_stop_backup(boolean, boolean)函数更改为pg_backup_start(text, boolean)、pg_backup_stop(boolean)函数。15以下需要调整以上两个函数名称进行授权

CREATE ROLE backup WITH LOGIN replication;
CREATE DATABASE backupdb owner backup ;
c backupdb
BEGIN;
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;
GRANT SELECT ON TABLE pg_catalog.pg_database TO backup;
COMMIT;

为备份专用库和用户创建专用白名单规则

## 在$PGDATA/pg_hba.conf 文件中为其添加以下规则,尽量放到最前面,避免专用用户和DB被其他规则优先命中,优先选择使用白名单trust规则进行备份,也可以使用pgpass方法对备份专用用户进行免密登录
host backupdb,replication backup all trust
远程备份

备份数据当然是部署在远端是最好的,同时可以避免更多的的侵入性风险。也可以采用NFS的远程文件链接,避免单一中心的容灾故障。
远程备份需要调整创建实例时的相关参数。并创建远程与本地postgres用户的ssh免密
我们使用10.0.0.139节点对postgresql正在运行的10.0.0.138节点进行备份。
10.0.0.139节点我们称为备份端,
10.0.0.138节点我们称为服务端。

## 如果远程备份,需要配置SHH相关得免密通信。
/home/postgres/pg/bin/pg_probackup add-instance -B  /home/postgres/backup  -D $PGDATA 
   --instance=test 
   -U backup -d backupdb   
   --remote-host=10.0.0.138 
   --remote-user=postgres

配置备份端与服务端postgres用户的ssh免密,这里如果服务端10.0.0.138采用的repmgr 或者 Patroni 高可用方案,可能服务端已经存在正在使用的pub密钥,执行以下pub生成操作需要谨慎执行。

su - postgres 
ssh-keygen -t rsa

然后将10.0.0.138、10.0.0.139的~/.ssh/id_rsa.pub 同步到.ssh/authorized_keys 
文件中
## 在执行远程归档的时候 pg_probackup 需要从服务端登录的到备份端,在 add-instance, backup, restore, catchup, archive-push, and archive-get.相关指令下需要备份端登录到服务端。所以需要服务端和备份端的.ssh/authorized_keys 应该同步保持一致。

##测试免密可用性
ssh 10.0.0.138 date;ssh 10.0.0.139 date

配置归档命令

pg_probackup archive-get 和pg_probackup archive-push指令进行归档,
正如指令名称所示:
pg_probackup archive-get :这命令由pg_probackup自动设置,作为 restore_command当 使用WAL存档恢复备份。不需要设置手动启动。
pg_probackup archive-push:是服务端通过ssh到备份端推送WAL文件。可以将pg_probackup archive-push配置到  archive_command中。
archive-push

使用示例:
archive_command = ‘/home/postgres/pg/bin/pg_probackup archive-push -B /home/postgres/backup –instance=test –wal-file-name=%f –wal-file-path=%p –remote-host=10.0.0.138 –remote-user=postgres –log-level-file=verbose –log-directory=/home/postgres/pg –log-rotation-age=7d –log-filename=archive_%w.log’

 由于--log-filename=archive_%w.log中使用strftime() escapes,所以不能直接使用archive_command进行调用指令,需要使用一个shell脚本进行封装让 archive_command 直接调用脚本
 cat > /home/postgres/pg/bin/archive_wrapper.sh <<'EOF'
#!/bin/bash
weekday=$(date +%w)
/home/postgres/pg/bin/pg_probackup archive-push 
  -B /home/postgres/backup 
  --instance=test 
  --wal-file-name="$1" 
  --wal-file-path="$2" 
  --remote-host=10.0.0.138 
  --remote-user=postgres 
  --log-level-file=verbose 
  --log-directory=/home/postgres/pg 
  --log-filename="archive_${weekday}.log" 
EOF

chmod +x /home/postgres/pg/bin/archive_wrapper.sh

 archive_command = '/home/postgres/pg/bin/archive_wrapper.sh %f %p'
 

–log-filename 可以使用strftime() escapes ,以下是一些strftime() 转义序列示例:

转义符 含义 示例值
%Y 年(4位数) 2025
%y 年(后2位) 25
%m 月(01–12) 06
%d 日(01–31) 30
%H 小时(00–23) 13
%I 小时(01–12,12小时制) 01
%M 分钟(00–59) 45
%S 秒(00–59) 09
%p AM 或 PM PM
%Z 时区名 CST
%z UTC 时区偏移 +0800
%A 星期几(全称) Monday
%a 星期几(缩写) Mon
%B 月份名称(全称) June
%b 月份名称(缩写) Jun
%j 一年中的第几天(001–366) 181
%w 星期几(0=Sunday) 1(表示星期一)
%U 一年中的第几周(以周日为第一天) 26
%W 一年中的第几周(以周一为第一天) 26
%c 本地日期时间表示法 Mon Jun 30 13:45:22 2025
%x 本地日期 06/30/25
%X 本地时间 13:45:22

配置备份策略

set-config进行配置

pg_probackup set-config -B /home/postgres/backup --instance=test 
  --pgdata=/home/postgres/pg/data 
  -h 10.0.0.138 -p 5432 -U backup -d backupdb   
  --compress-algorithm=zlib --compress-level=5 
  --retention-redundancy=2 
  --archive-timeout=300 
  --log-level-console=info --log-level-file=verbose 
  --log-directory=/home/postgres --log-filename=backup_%Y%m%d.log 
  --remote-path=/home/postgres/pg/bin

–retention-redundancy=3 指定保留三个FULL备份
–retention-window=7 指定保留7天的备份
实际以上参数配置是冗余的。

查看备份配置情况

pg_probackup show-config -B /home/postgres/backup --instance=test 

通过图可以看出set-config 配置的参数名和写入到pg_probackup.conf文件的参数名还是有差异 所以不要手工去修改pg_probackup.conf文件。

执行备份

pg_probackup 支持的备份策略

🗃️ pg_probackup 支持的备份类型与说明

备份类型 是否依赖 WAL 归档 依赖 Full 备份 特点说明
Full ❌ 不依赖 ❌ 不依赖 完整备份,包含还原整个数据库所需的所有文件,自包含,可独立恢复的完整备份
Page ✅ 必须依赖 ✅ 必须依赖 扫描归档 WAL,只备份在 WAL 中提到的页,节省空间但依赖完整的 WAL, 增量备份,依赖 WAL 归档,节省空间
Delta ❌ 不依赖 ✅ 必须依赖 直接扫描数据文件,拷贝修改过的页,无需归档但 I/O 接近全备, 增量备份,无需归档,但读 IO 大
Ptrack ❌ 不依赖 ✅ 必须依赖 依赖 PostgreSQL 的 page tracking 功能,几乎无 I/O 压力,速度最快,但需开启 PTRACK 支持(例如 patched PG),增量备份,基于 PTRACK 位图,最快

所有链条最终都需要一个 Full 作为基础点,一旦 Full 被删除,其后的增量备份将无法恢复

以上备份中Page策略,就是我在postgresql增量备份系列一种 PITR增量备份的一种变种,通过读取WAL的块偏移量,进行增量备份。

🔄 WAL 策略支持
策略类型 是否依赖归档 依赖 Full 备份 说明
Autonomous ❌ 不依赖 ✅ 依赖 通过复制协议拉取所有需要的 WAL,备份中自动打包 WAL ,通常应用在streaming的备份阶段,将备份端的WAL文件一并备份到备份端口的$backups_dir/instance_name/pg_wal路径中
Archive ✅ 依赖 ❌ 不依赖 依赖于已有的 WAL 持续归档机制(如 archive_command)

执行backup可选参数说明

pg_probackup backup -B backup_dir -b backup_mode --instance=instance_name
[--help] [-j num_threads] [--progress]
[-C] [--stream [-S slot_name] [--temp-slot]] [--backup-pg-log]
[--no-validate] [--skip-block-validation]
[-w --no-password] [-W --password]
[--archive-timeout=timeout] [--external-dirs=external_directory_path]
[--no-sync] [--note=backup_note]
[connection_options] [compression_options] [remote_options]
[retention_options] [pinning_options] [logging_options]
🔌 1. connection_options(连接选项)
参数 说明
-h, --host 数据库主机名或IP
-p, --port 数据库端口号
-U, --username 连接使用的用户名
-d, --dbname 数据库名
-w, --no-password 禁止交互式密码输入
-W, --password 强制交互式输入密码
📦 2. compression_options(压缩选项)
参数 说明
--compress 启用压缩,默认使用 zlib + 低压缩等级
--compress-algorithm=算法 指定压缩算法:none / zlib / pglz
--compress-level=0-9 压缩等级(数字越大压缩比越高,速度越慢)
🌐 3. remote_options(远程连接选项)
参数 说明
`–remote-proto=ssh none`
--remote-host=主机 远程主机地址
--remote-user=用户 SSH 登录用户,常设为 postgres
--remote-port=端口 SSH 端口(默认22)
--remote-path=路径 远程 pg_probackup 路径
--ssh-options="..." 额外 SSH 参数(如 -i 指定密钥)
♻️ 4. retention_options(保留策略选项)
参数 说明
--retention-redundancy=N 保留 N 个完整备份及其增量链
--retention-window=DAYS 保留近 N 天的备份
--wal-depth=N 为 PITR 保留 N 个 WAL 文件段
📌 5. pinning_options(固定备份选项)
参数 说明
pin 标记备份为固定(不会被 retention 策略删除)
unpin 取消固定标记,恢复为可删除状态
用法 需通过 pg_probackup set-backup 手动指定
📋 6. logging_options(日志控制选项)
参数 说明
--log-level-console=等级 控制控制台输出等级:off、error、info、verbose
--log-level-file=等级 控制日志文件输出等级
--log-filename=文件名 日志文件名(支持时间占位符)
--log-directory=目录 日志输出目录
--log-rotation-size=SIZE 设置日志文件按大小轮转
--log-rotation-age=DURATION 设置日志文件按时间轮转(如7d)

⚠️ 配置冲突与注意事项
冲突情况 说明
--compress-algorithm=pglzarchive-push 不兼容,pglz 不支持 WAL 推送场景
--remote-proto=none--remote-host 冲突,应统一使用 ssh 模式或全部本地配置
--stream--remote-user 搭配不当 若使用远程备份,还需保证复制槽和权限一致
pin 与 retention 设置 pin 的备份不受 retention 删除策略影响
--no-sync--skip-block-validation 提高速度但牺牲一致性保障,慎用于生产环境

以上所示的指令参数都会覆盖掉pg_probackup.conf 种配置的参数项目

✅ 示例命令:

在以上的四种备份方法中,三个增量都是需要全量备份的,所以第一个备份就备份时full开头

pg_probackup backup -B /home/postgres/backup -b full 
  -U backup -d backupdb   
  --instance=test -j 3 -C 
  --stream --temp-slot --progress 
  --remote-host=10.0.0.138 
  --remote-user=postgres 
  --delete-wal 
  --delete-expired 
  --merge-expired 

查看备份情况

pg_probackup show  -B /home/postgres/backup 

查看归档情况

pg_probackup show  -B /home/postgres/backup  --archive

增量备份

pg_probackup backup -B /home/postgres/backup -b page 
  -U backup -d backupdb   
  --instance=test -j 3 -C 
  --stream --temp-slot --progress 
  --remote-host=10.0.0.138 
  --remote-user=postgres 
  --delete-wal 
  --delete-expired 
  --merge-expired 

数据恢复操作

#模拟一次误删数据
postgres=# create table t1(id int);
CREATE TABLE
postgres=# select pg_current_wal_lsn();
 pg_current_wal_lsn 
--------------------
 0/4D000148
(1 row)

postgres=# drop table t1 ;
DROP TABLE
postgres=# q


 pg_probackup restore -B /home/postgres/backup --instance=test 
  --pgdata=/home/postgres/pg/data_restore 
  --recovery-target-lsn='0/4D000148' 
  --log-level-console=info 
  --remote-host=10.0.0.138 
  --remote-user=postgres 
  --recovery-target-inclusive=true 
  --recovery-target-action=promote

recovery_target_inclusive :
指定是在指定恢复目标( on )之后停止,还是在恢复目标( off )之前停止。当指定了recovery_target_lsn、recovery_target_time或recovery_target_xid时适用。该设置控制是否将分别具有完全相同的目标WAL位置(LSN)、提交时间或事务ID的事务包含在恢复中。默认值 on 。
指定恢复到–pgdata目录,

恢复完成之后需要手工删掉$RESORE_PGDATA/recovery.signal恢复标志文件,才能拉起数据库。

PS: pg_probackup 的option项还是很多,支持的差异性功能还是比较丰富。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容