PostgreSQL 物理备份 + WAL 详细的 增量备份 方案
下面是一份 物理备份 + WAL 的“完整增量备份方案”,这也是 PostgreSQL 官方推荐、企业级最常用、能实现 真正增量恢复(PITR) 的方案。
原理 -> 目录结构 -> 配置 -> 备份流程 -> 增量恢复流程 -> 自动化脚本 -> 最佳实践
🔥 核心思想(仅 3 点)
- 物理备份(pg_basebackup) = 「基线镜像」
- WAL 归档 = 记录所有后续变化(增量日志)
- 恢复时:基线备份 + 所有 WAL = 任意时间点的数据
增量点完全来自 WAL,不依赖差异备份(因为 PostgreSQL 不支持块级差异备份)。
/pgdata/ # PG 数据目录
/base_backup/ # 物理备份(每日)
2025-02-01/
2025-02-02/
...
/wal_archive/ # WAL 增量日志归档(持续产生)
000000010000000000000001
000000010000000000000002
...
/backup_scripts/ # 自动化脚本
修改 postgresql.conf:
wal_level = replica # 必须
archive_mode = on # 启用归档
archive_command = 'cp %p /wal_archive/%f' # 复制WAL
max_wal_senders = 10
wal_keep_size = 1024 # 视规模设置(MB)
创建目录:
mkdir -p /wal_archive
chmod 700 /wal_archive
验证是否生效:
SELECT pg_switch_wal();
看是否生成 WAL 文件。
每天一次即可。
pg_basebackup \
-U backup \
-D /base_backup/2025-02-10 \
-Fp -Xs -P
解释:
- -Fp -> 目录格式
- -Xs -> 同步复制备份时刻的 WAL
- -P -> 显示进度
备份后目录:
/base_backup/2025-02-10/
/wal_archive/ # WAL 持续增加
例如:
| 时间 | 事件 |
|---|---|
| 02-10 00:00 | pg_basebackup(全量) |
| 02-10 01:00 | WAL 文件增量 |
| 02-10 02:00 | WAL 文件增量 |
| 02-10 03:00 | WAL 文件增量 |
你要恢复 03:05 的数据 ->
用 00:00 的物理备份 + 01~03 点 WAL = 自动恢复到 03:05。
这就是 增量备份。
这是 WAL 方案的核心价值。
systemctl stop postgresql
rm -rf /pgdata/*
例如:
cp -r /base_backup/2025-02-10/* /pgdata/
创建恢复信号:
touch /pgdata/recovery.signal
在 postgresql.auto.conf 添加:
restore_command = 'cp /wal_archive/%f %p'
recovery_target_time = '2025-02-10 03:05:00'
你也可以用:
- recovery_target_lsn
- recovery_target_xid
- recovery_target_name
- recovery_target = ‘immediate’(恢复到尽可能近)
systemctl start postgresql
PostgreSQL 自动按顺序 replay 所有 WAL 文件,到达指定时间自动停。
#!/bin/bash
DATE=$(date +%F)
DIR="/base_backup/$DATE"
mkdir -p $DIR
pg_basebackup -U backup -D "$DIR" -Fp -Xs -P
find /base_backup/ -maxdepth 1 -mtime +7 -exec rm -rf {} \;
wal 文件可能很多,通常保留 3~7 天:
find /wal_archive/ -type f -mtime +7 -delete
查看日志:
journalctl -u postgresql -f
如果 WAL 丢失,则无法恢复到某些时间点。
一定要搭配:
pg_basebackup -Xs
否则恢复会失败。
忘了删除 recovery.signal
- 必须开启 WAL 归档(企业默认)
- 物理 + WAL 是最可靠、最高可用的备份方案
- 每周执行恢复演练
- 备份放多地(本地 + 对象存储 S3/OSS)
- 单机也必须做 WAL 增量备份(防止误删 / 灾难)
- 物理备份 + WAL + 逻辑备份 = 三重保护
- 流复制不等于备份 -(因为误操作会同步到从库)
PostgreSQL 没有像 MySQL 那样的“差异备份”,
因为 增量完全靠 WAL 完成。
所以……
🔥 增量备份 = 物理备份 + WAL
- 物理备份 = 基线
- WAL = 所有增量
- PITR = 到任意时间恢复
- 企业标准方案