一、pgBackRest 核心概念
1.1 工具定位
pgBackRest 是 PostgreSQL 生态工业级第三方开源备份工具,非官方内置工具,完美弥补原生 pg_basebackup 仅支持全量备份的短板。支持全量、差异、增量物理备份,内置 WAL 自动归档、PITR 时间点恢复、备份校验、过期清理、从库备份、集群切换自动适配等企业级能力,是生产大集群、TB级数据的标准备份方案。
Repo 是物理存储载体,用于统一存放备份数据、归档 WAL、备份元数据,支持三种存储模式:本地磁盘、远端 SSH 服务器、S3/OSS 对象存储。
仓库核心存储结构:
archive 目录:存放所有归档 WAL 日志,是 PITR 时间点恢复的核心依赖
backup 目录:存放全量、增量、差异物理备份集
元数据文件:记录备份链、校验和、时间线、节点信息,保障备份完整性
核心特性:单仓库可容纳多套数据库集群备份,通过 Stanza 逻辑隔离,自动清理过期备份、自动校验文件完整性。
1.2.2 Stanza(备份集)
Stanza 是逻辑隔离单元,是 pgBackRest 的核心业务标识。一套 PostgreSQL 主备集群(一主多从)仅对应一个 Stanza,不同业务、不同实例集群需配置独立 Stanza。
核心作用:
隔离多集群备份数据,避免备份、恢复误操作串库
绑定集群所有节点信息,实现主备角色自动识别
独立管理备份生命周期、保留策略、归档链路
1.3 核心优势(对比原生工具)
原生 pg_basebackup 仅支持全量备份,pgBackRest 支持全量/差异/增量三级备份,大幅降低备份 IO 和存储开销
内置 WAL 自动归档、备份校验、过期清理,无需手写复杂 Shell 脚本
支持从备库备份,彻底规避主库备份 IO 压力
主备切换自动适配,无需修改配置文件
支持并行备份恢复、压缩、断点续传、对象存储异地灾备
二、pgBackRest 生产安装与环境初始化
2.1 安装部署
CentOS/RHEL 系统
yum install -y epel-release
yum install -y pgbackrest postgresql15-contrib
Ubuntu/Debian 系统
apt update
apt install -y pgbackrest postgresql-15-contrib
2.2 目录初始化与权限配置
所有目录必须归属 postgres 用户,权限 700,否则备份、归档报错。
# 创建备份仓库、日志目录
mkdir -p /pg_backup/repo
mkdir -p /var/log/pgbackrest
# 权限统一配置
chown -R postgres:postgres /pg_backup /var/log/pgbackrest
chmod 700 /pg_backup/repo
2.3 集群节点免密互通(必备)
从库备份、跨节点探测角色依赖 SSH 免密互通,所有主备节点需双向免密。
su - postgres
# 生成密钥
ssh-keygen -t ed25519 -N ""
# 推送公钥至所有集群节点(示例备库IP)
ssh-copy-id postgres@192.168.10.11
三、主备集群完整配置(支持从库备份+切换自动适配)
3.1 环境规划
主节点 pg1:192.168.10.10
备节点 pg2:192.168.10.11
Stanza 名称:pg_cluster
备份仓库:/pg_backup/repo
3.2 全局+集群配置文件 /etc/pgbackrest/pgbackrest.conf
[global]
# 备份仓库路径
repo1-path=/pg_backup/repo
# 保留2份全量备份,自动清理过期备份链
repo1-retention-full=2
# 压缩策略
compress-type=zstd
compress-level=3
# 开启备库备份(核心参数)
backup-standby=y
# 并行备份加速
process-max=4
# 日志配置
log-path=/var/log/pgbackrest
log-level-file=info
# 集群备份集:包含所有主备节点,不固定主备角色
[pg_cluster]
# 节点1
pg1-host=192.168.10.10
pg1-host-user=postgres
pg1-path=/var/lib/postgresql/15/main
pg1-port=5432
pg1-user=postgres
# 节点2
pg2-host=192.168.10.11
pg2-host-user=postgres
pg2-path=/var/lib/postgresql/15/main
pg2-port=5432
pg2-user=postgres
3.3 数据库 WAL 归档配置(仅主库)
备库无需配置归档,仅主库产生 WAL 并推送至备份仓库。编辑 postgresql.conf:
wal_level = replica
archive_mode = on
archive_command = 'pgbackrest --stanza=pg_cluster archive-push %p'
max_wal_senders = 10
wal_log_hints = on
重启数据库生效:
systemctl restart postgresql@15-main
3.4 仓库与备份集初始化
su - postgres
# 创建备份集,生成仓库目录结构
pgbackrest --stanza=pg_cluster stanza-create
# 全局校验:节点连通性、归档、权限、角色探测
pgbackrest --stanza=pg_cluster check
无报错即为配置正常,支持从库备份与自动角色识别。
四、备份操作(自动优先备库,切换无感知)
4.1 日常自动备份(生产推荐)
自动判断备份类型:距离全量备份过期则执行 full 全量,否则执行 incr 增量,优先备库备份,备库故障自动降级主库。
pgbackrest --stanza=pg_cluster backup
4.2 手动指定备份类型
# 强制全量备份
pgbackrest --stanza=pg_cluster --type=full backup
# 强制差异备份
pgbackrest --stanza=pg_cluster --type=diff backup
4.3 备份状态查看与运维命令
# 查看所有备份集信息
pgbackrest --stanza=pg_cluster info
# 手动触发过期备份清理
pgbackrest --stanza=pg_cluster expire
# 校验备份与 WAL 完整性
pgbackrest --stanza=pg_cluster check
# 查看归档 WAL 状态
pgbackrest --stanza=pg_cluster archive-info
五、定时自动备份配置
使用 crontab 定时触发,无需复杂脚本,适配所有主备切换场景。postgres 用户定时任务:
crontab -e
# 每日凌晨2点自动备份
0 2 * * * pgbackrest --stanza=pg_cluster backup >> /var/log/pgbackrest/cron_backup.log 2>&1
# 每10分钟校验归档状态
*/10 * * * * pgbackrest --stanza=pg_cluster archive-check
六、主备切换自动适配原理(核心重点)
6.1 自动识别机制
pgBackRest 不固化主备角色,每次备份前实时探测集群所有节点角色:
执行
pg_is_in_recovery()判断节点状态返回 false = 主库(可读写)
返回 true = 备库(只读)
备份优先级:优先在线备库 > 所有备库离线则降级主库。
6.2 两种切换场景适配
场景1:计划切换(Switchover)
原主停机、备库提升为新主,原主修复后变为新备库。pgBackRest 无需修改任何配置,下次备份自动识别新备库,继续从备库执行备份。
场景2:故障切换(Failover)
原主崩溃,备库强制升主。备份任务自动检测备库全部离线,临时降级新主备份;待旧主修复加入集群变为备库后,自动切回备库备份,全程备份不中断。
6.3 切换后 WAL 归档适配
仅当前主库执行 archive-push 推送 WAL
切换后新主自动接管归档任务
旧主变为备库后自动停止归档,避免重复推送、归档错乱
七、恢复操作完整示例
7.1 恢复前置操作(必做)
停止数据库、迁移旧数据、清空目录,避免数据冲突。
systemctl stop postgresql@15-main
mv /var/lib/postgresql/15/main /var/lib/postgresql/15/main.bak
mkdir /var/lib/postgresql/15/main
chown postgres:postgres /var/lib/postgresql/15/main
7.2 三种恢复场景
场景1:恢复至最新状态
pgbackrest --stanza=pg_cluster restore
场景2:PITR 时间点恢复
pgbackrest --stanza=pg_cluster --type=time --time="2026-06-24 10:30:00" restore
场景3:恢复至指定备份集
pgbackrest --stanza=pg_cluster --set=20260624-020000F restore
恢复完成后启动数据库即可正常对外提供服务。
八、生产核心注意事项
节点配置规范:一个 Stanza 必须录入集群所有主备节点,仅配置单节点会导致切换后无法识别备库。
免密互通必备:所有集群节点 postgres 用户双向 SSH 免密,否则无法远程读取备库数据、探测节点角色。
表空间一致性:主备集群所有节点表空间挂载路径必须完全一致,否则备份、恢复、rewind 操作报错。
归档唯一性:仅主库开启 archive_command,备库禁止配置,防止 WAL 重复推送导致归档异常。
脑裂防护:集群出现双主时,pgBackRest 会检测到多个主库,直接终止备份,保护备份链一致性。
权限严格管控:仓库、日志、数据目录必须归属 postgres:postgres,权限 700,权限过宽会导致备份失败。
备份链完整性:增量、差异备份依赖基础全量备份,禁止手动删除仓库内任意备份文件,否则整条备份链失效。




