Skip to main content
Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

PostgreSQL 物理备份 + WAL 详细的 增量备份 方案

下面是一份 物理备份 + WAL 的“完整增量备份方案”,这也是 PostgreSQL 官方推荐、企业级最常用、能实现 真正增量恢复(PITR) 的方案。

原理 -> 目录结构 -> 配置 -> 备份流程 -> 增量恢复流程 -> 自动化脚本 -> 最佳实践

🔥 核心思想(仅 3 点)

  1. 物理备份(pg_basebackup) = 「基线镜像」
  2. WAL 归档 = 记录所有后续变化(增量日志)
  3. 恢复时:基线备份 + 所有 WAL = 任意时间点的数据

增量点完全来自 WAL,不依赖差异备份(因为 PostgreSQL 不支持块级差异备份)。

1. 文件结构(推荐标准)

/pgdata/                      # PG 数据目录
/base_backup/                 # 物理备份(每日)
    2025-02-01/
    2025-02-02/
    ...

/wal_archive/                 # WAL 增量日志归档(持续产生)
    000000010000000000000001
    000000010000000000000002
    ...

/backup_scripts/              # 自动化脚本

2. PostgreSQL WAL 归档配置(最关键)

修改 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 文件。

3. 物理备份(pg_basebackup)= 基线备份

每天一次即可。

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 持续增加

4. 物理 + WAL = 如何构成“增量备份”

物理备份:一次

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。

这就是 增量备份

5. 增量恢复(时间点恢复)完整流程

这是 WAL 方案的核心价值。

✨ Step 1:停止 PostgreSQL

systemctl stop postgresql

✨ Step 2:清空原数据库目录

rm -rf /pgdata/*

✨ Step 3:恢复某次物理备份

例如:

cp -r /base_backup/2025-02-10/* /pgdata/

✨ Step 4:创建恢复配置(PostgreSQL ≥ 12)

创建恢复信号:

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’(恢复到尽可能近)

✨ Step 5:启动 PostgreSQL

systemctl start postgresql

PostgreSQL 自动按顺序 replay 所有 WAL 文件,到达指定时间自动停。

6. 自动化脚本(企业必备)

每日基线备份(backup_full.sh)

#!/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 清理策略(根据保留天数)

wal 文件可能很多,通常保留 3~7 天:

find /wal_archive/ -type f -mtime +7 -delete

7. 增量备份常见问题

❌ archive_command 报错 -> WAL 丢失(最危险)

查看日志:

journalctl -u postgresql -f

如果 WAL 丢失,则无法恢复到某些时间点。

❌ 物理备份与实际 WAL 不匹配

一定要搭配:

pg_basebackup -Xs

否则恢复会失败。

❌ 恢复后变只读

忘了删除 recovery.signal

8. 最佳实践(最重要的部分)

  • 必须开启 WAL 归档(企业默认)
  • 物理 + WAL 是最可靠、最高可用的备份方案
  • 每周执行恢复演练
  • 备份放多地(本地 + 对象存储 S3/OSS)
  • 单机也必须做 WAL 增量备份(防止误删 / 灾难)
  • 物理备份 + WAL + 逻辑备份 = 三重保护
  • 流复制不等于备份 -(因为误操作会同步到从库)

🎯 总结:物理备份 + WAL = 官方顶级增量方案

PostgreSQL 没有像 MySQL 那样的“差异备份”,

因为 增量完全靠 WAL 完成

所以……

🔥 增量备份 = 物理备份 + WAL

  • 物理备份 = 基线
  • WAL = 所有增量
  • PITR = 到任意时间恢复
  • 企业标准方案