PostgreSQL 在 Linux 上的备份策略总览
策略对比与适用场景
| 策略 | 主要工具 | 备份粒度 | 恢复能力 | 优点 | 局限 | 典型场景 |
|---|---|---|---|---|---|---|
| 逻辑备份 | pg_dump / pg_dumpall | 单库 / 全集群对象 | 到备份时刻的一致性;不支持 PITR | 跨版本迁移、选择性恢复、体积小 | 恢复重建索引耗时、长事务可能影响性能 | 开发/测试、小中型库、结构/对象级恢复 |
| 物理备份 + WAL | pg_basebackup + WAL 归档 | 集群级一致性副本 | 时间点恢复(PITR) | 接近崩溃一致、恢复可快进到任意时间点 | 需配置 WAL 归档与存储;版本升级需同主版本 | 生产库、要求 RPO/RTO 较高的业务 |
| 第三方增强 | pgBackRest | 集群级 | PITR + 差异/增量 | 并行/压缩/加密、多仓库、增量还原 | 需学习配置与运维 | 中大型与严格 RTO/RPO 场景 |
常见备份策略范式
范式一 逻辑备份 + 定时清理
使用 pg_dump -F c -b -v | gzip 生成自定义格式并压缩;以 crontab 每日执行;按保留天数删除旧备份;记录日志并定期做恢复演练。适合需要跨版本迁移、按库/表恢复的场景。
范式二 物理备份 + WAL 归档实现 PITR
配置 wal_level=replica / archive_mode=on / archive_command(将 WAL 段拷贝到安全位置);用 pg_basebackup -Fp -Xs -P 获取基础备份;恢复时配置 restore_command 回放 WAL 至目标时间点。适合生产环境的高可靠恢复。
范式三 第三方工具编排全量/差异/增量
以 pgBackRest 统一管理备份库与存储库,制定“每周全量 + 每日差异/增量”策略,结合 WAL 归档实现快速 PITR 与多副本存储。适合中大型与严格 RTO/RPO 要求。
自动化与运维要点
快速上手示例
逻辑备份脚本(单库,自定义格式 + 压缩 + 保留 30 天)
#!/bin/bash
BACKUP_DIR="/data/pg_backup"
DB_NAME="your_db"
DB_USER="postgres"
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_$(date +%Y%m%d_%H%M%S).sql.gz"
RETENTION_DAYS=30
mkdir -p "$BACKUP_DIR"
pg_dump -U "$DB_USER" -d "$DB_NAME" -F c -b -v | gzip > "$BACKUP_FILE"
if [ $? -eq 0 ]; then
echo "$(date +%F_%T) 备份成功:$BACKUP_FILE" >> "$BACKUP_DIR/backup.log"
else
echo "$(date +%F_%T) 备份失败" >> "$BACKUP_DIR/backup.log"
exit 1
fi
find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +${RETENTION_DAYS} -delete
定时任务(切换到 postgres 用户):0 3 * * * /path/to/pg_backup.sh。
物理备份 + WAL 归档(PITR 基础)
wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/pgsql/archive/%f'
pg_basebackup -D /var/lib/pgsql/15/basebackup -Fp -Xs -P
# 准备恢复目录
rm -rf /var/lib/pgsql/15/data/*
tar xf /var/lib/pgsql/15/basebackup/base.tar.gz -C /var/lib/pgsql/15/data
mkdir -p /var/lib/pgsql/15/data/pg_wal
tar xf /var/lib/pgsql/15/basebackup/pg_wal.tar.gz -C /var/lib/pgsql/15/data/pg_wal
# 配置回放 WAL
echo "restore_command = 'cp /var/lib/pgsql/15/archive/%f %p'" \
>> /var/lib/pgsql/15/data/postgresql.conf
# 启动到恢复模式
touch /var/lib/pgsql/15/data/recovery.signal
systemctl start postgresql-15
恢复将自动回放 WAL 至完成点(可按需设置目标时间/事务)。