2026 年 4 月 27 日,一条消息出现在 pgBackRest 项目仓库:项目即将归档,主动维护终止。对于大量依赖 pgBackRest 做 PostgreSQL 备份与恢复的生产环境来说,这几乎是一声闷雷——十年来最广泛使用的备份工具,突然被贴上 "dead"、"EOL"、"abandoned" 的标签。
导火索并不复杂:长期维护者在超过十年的无偿投入后,明确表示没有可持续资金就无法继续,选择归档仓库。消息传得快,解读传得更快。
pgBackRest 为什么重要
pgBackRest 不是一个小众工具。在 PostgreSQL 生态里,它和 Barman 一起构成了企业级备份的两大主流方案。它的核心能力:
- 全量 + 增量 + 差异备份,支持多备份仓库(repo),可同时写本地和 S3 等远程存储
- 逐文件压缩与并行传输,大数据库备份时间可压缩到原来的几分之一
- 时间点恢复(PITR),配合 WAL 归档可恢复到任意秒级时间点
- 备份保留策略,按全量备份轮转自动清理增量,避免存储膨胀
- 加密备份,repo 级别 AES-256 加密
大量企业把 pgBackRest 嵌进了 Ansible/Terraform 部署流水线、Kubernetes Operator(如 Patroni + pgBackRest 组合),甚至云厂商的托管服务底层也在用它。这意味着——它停维,不是换一个工具就能了事的事。
停维的真实含义
"归档仓库"和"彻底不可用"不是同一件事。归档后:
- 代码仍然可读、可 clone、可自行编译
- 已有 release 不会消失
- Issue 和 PR 不再接受,安全漏洞不会再有人主动修
- 新版 PostgreSQL 的兼容性不会再有人跟进
所以更准确的定位是:pgBackRest 进入无人维护的冻结状态。对于已经稳定运行、不打算升级 PostgreSQL 大版本的场景,短期内风险可控;但对于需要长期演进、安全合规、或计划升级到 PostgreSQL 18+ 的团队,风险在时间轴上持续累积。
根本问题:开源维护的可持续性
pgBackRest 的维护者不是"不想干了",而是干了十年,没有可持续收入。这不是个例——过去几年里,从 log4j 到 core-js,类似的故事反复上演:
- 单人维护、企业级依赖、零资金支持
- 用户免费享受成果,直到某一天维护者退出才意识到风险
- 社区反应总是"震惊",但维护者的疲惫往往已经持续数年
pgBackRest 的案例再次证明一个硬事实:生产级开源工具必须有可持续的资金模型,否则"免费"只是延迟付款。
当前该怎么办:实用检查与替代方案
如果你的生产环境正在用 pgBackRest,现在需要做两件事:评估短期风险,准备中长期替代。
第一步:盘点现有依赖
# 检查当前 pgBackRest 版本
pgbackrest --version
# 查看所有配置的备份仓库
pgbackrest info
# 检查最近一次备份是否成功完成
pgbackrest info --output=json | python3 -c "
import json, sys
data = json.load(sys.stdin)
for repo in data:
for backup in repo.get('backup', []):
print(f\"备份 {backup['label']} 状态: {backup['status']['code']} "
f\"时间: {backup['timestamp']['start']} "
f\"类型: {backup['type']}\")
"
# 确认 WAL 归档是否正常推送
pgbackrest stanza-list
把以上输出记录下来。如果最近备份状态码不是 0(完成),立刻修复——停维之后不会再有 bugfix,现有功能必须确保稳定运行。
第二步:锁定版本,冻结配置
# 在部署流水线中锁定 pgBackRest 版本号,避免意外升级
# 例如在 Ansible playbook 中:
# - name: Install pgbackrest
# package:
# name: pgbackrest-2.54 # 锁定具体版本
# state: present
# 如果用 pip 或源码编译,记录当前 commit hash
cd /path/to/pgbackrest-source
git log -1 --format="%H"
# 输出类似: a1b2c3d4e5f6... 将此 hash 写入部署文档
第三步:评估替代方案
目前 PostgreSQL 生态中可考虑的备份工具:
| 工具 | 特点 | 适合场景 |
|---|---|---|
| Barman | 企业级备份,支持 PITR、并行、SSH/Rsync 传输 | 已有 Barman 经验的团队 |
| pg_basebackup | PostgreSQL 自带,简单可靠 | 小规模、不需要增量备份 |
| WAL-G | 云原生风格,支持 S3/GCS/Azure,增量备份 | Kubernetes / 云环境 |
| 自定义脚本 + pg_basebackup + WAL 归档 | 最灵活,维护成本最高 | 有专职 DBA 团队 |
以 WAL-G 为例,一个最小化切换配置:
# 安装 WAL-G(Go 实现,单二进制文件)
curl -L https://github.com/wal-g/wal-g/releases/download/v1.1.0/wal-g-linux-amd64 \
-o /usr/local/bin/wal-g
chmod +x /usr/local/bin/wal-g
# 配置 S3 存储
export WALG_S3_PREFIX="s3://my-pg-backup-bucket/cluster-x"
export AWS_ACCESS_KEY_ID="AKIA..."
export AWS_SECRET_ACCESS_KEY="..."
export AWS_REGION="us-east-1"
# 配置 PostgreSQL WAL 归档到 WAL-G
# 在 postgresql.conf 中设置:
# wal_level = replica
# archive_mode = on
# archive_command = 'wal-g wal-push %p'
# 执行一次全量备份
wal-g backup-push /var/lib/postgresql/17/main
# 验证备份列表
wal-g backup-list
注意:WAL-G 的增量备份需要先启用
wal-g backup-push的 delta 模式,具体参数见其文档。切换期间建议 pgBackRest 和 WAL-G 并行运行一段时间,确认新工具备份可恢复后再退役旧方案。
第四步:验证恢复能力
无论用什么工具,没有验证过的备份等于没有备份。定期做恢复演练:
# 用 pgBackRest 做一次时间点恢复验证(停维前仍可用)
# 1. 停止目标恢复实例
pg_ctlcluster 17 main stop
# 2. 清空数据目录
rm -rf /var/lib/postgresql/17/main/*
# 3. 恢复到指定时间点
pgbackrest restore --stanza=main \
--type=time "--target=2026-05-01 14:30:00" \
--target-action=promote
# 4. 启动并验证数据完整性
pg_ctlcluster 17 main start
psql -c "SELECT count(*) FROM critical_table;"
# 切换到 WAL-G 后的恢复验证:
# wal-g backup-fetch /var/lib/postgresql/17/main LATEST
# 然后配置 recovery.conf / restore_command 指向 wal-g wal-fetch
短期行动清单
| 优先级 | 动作 | 时间窗口 |
|---|---|---|
| P0 | 确认最近 pgBackRest 备份全部成功 | 本周 |
| P0 | 锁定 pgBackRest 版本,冻结部署 | 本周 |
| P1 | 评估替代工具,选定方向 | 2-4 周 |
| P1 | 建立并行备份(新旧工具同时运行) | 1 个月内 |
| P2 | 完成恢复演练,确认新工具可用 | 2 个月内 |
| P2 | 退役 pgBackRest,切换到新方案 | 3-6 个月内 |
| P3 | 关注社区是否有人 fork 或接手 pgBackRest | 持续 |
pgBackRest 的停维不是终点——代码还在,社区还在。如果后续有组织或基金会提供资金让维护者回归,或有人 fork 出新项目,情况可能逆转。但作为生产环境负责人,不能把希望押在"也许有人会接手"上。现在盘点、锁定、准备替代,才是对业务负责的做法。