已经很久没有发文章了,主要是最近工作上的内容都不适合发文章公开。可能往后文章发表也不这么频繁了,不过大家有问题我们可以交流。之前有写过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_size 和 wal_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=pglz 与 archive-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项还是很多,支持的差异性功能还是比较丰富。
暂无评论内容