PostgreSQL 归档与恢复
一、归档与恢复的必要性
在 PostgreSQL 的生产环境中,**归档与恢复(Archiving & Recovery)**机制是确保数据安全、实现灾难恢复(如误删除、硬件故障)、支持时间点恢复(PITR)的核心手段。
✅ 什么情况下需要归档与恢复?
- 长期保留 WAL 日志,用于数据库的增量备份和恢复。
- 还原至任意历史时间点(Point-In-Time Recovery)。
- 灾备场景中通过归档日志与基础备份快速恢复。
- 逻辑误操作后快速回滚数据库状态。
二、WAL 归档机制概览
PostgreSQL 使用 Write-Ahead Logging(WAL)机制来保证数据一致性。归档 WAL 文件可以防止数据丢失,并为恢复提供基础。
🎯 WAL 归档触发条件
WAL 文件归档不会实时进行,而是满足以下条件之一时触发:
| 触发条件 | 说明 |
|---|---|
| WAL 文件写满 | 单个 WAL segment 文件写满(通常为 16MB) |
| 空间控制策略触发 | 达到 max_wal_size 或低于 min_wal_size |
| Checkpoint 触发 | 手动或自动执行的 checkpoint 操作: ➤ 手动: CHECKPOINT 命令➤ 自动:间隔触发( checkpoint_timeout 参数) |
三、创建归档存储目录
归档文件需要存储在安全、权限受控的目录中。以下命令创建归档目录并设置权限:
sudo mkdir /data/pg_archive
sudo chown postgres. /data/pg_archive
sudo chmod 700 /data/pg_archive
四、配置归档参数(postgresql.conf)
切换到 postgres 用户,配置归档与恢复参数:
su - postgres
cat <<'EOF' | tee -a $PGDATA/postgresql.conf > /dev/null
# ===== WAL 归档配置 =====
archive_mode = on # 启用归档
archive_command = 'cp %p /data/pg_archive/%f' # 归档命令,将 WAL 文件拷贝到归档目录
# ===== 恢复相关配置 =====
restore_command = 'cp /data/pg_archive/%f %p' # 恢复命令:指定恢复时如何找到 WAL 文件
recovery_target_timeline = 'latest' # 使用最新的时间线恢复
archive_cleanup_command = 'pg_archivecleanup /data/pg_archive %r' # 清理无用的 WAL 文件,节省空间
EOF
五、重启 PostgreSQL 服务使配置生效
pg_ctl restart
六、查看日志确认归档行为
cd $PGDATA/logs/
tail -f postgresql-`date "+%Y-%m-%d"`.log
七、验证归档功能是否正常
1️⃣ 查看归档配置是否生效
SELECT name, setting
FROM pg_settings
WHERE name IN (
'archive_mode',
'archive_command',
'archive_timeout',
'restore_command',
'recovery_target_timeline',
'archive_cleanup_command');
预期输出示例:
name | setting
------------------------+-----------------------------
archive_command | cp %p /data/pg_archive/%f
archive_mode | on
archive_timeout | 0
restore_command | cp /data/pg_archive/%f %p
recovery_target_timeline| latest
archive_cleanup_command | pg_archivecleanup /data/pg_archive %r
2️⃣ 手动切换 WAL,强制生成归档文件
SELECT pg_switch_wal();
输出示例:
pg_switch_wal
---------------
0/30000F0
(1 row)
3️⃣ 检查归档目录是否生成 WAL 文件
ls /data/pg_archive/
输出示例:
000000010000000000000001
000000010000000000000002
000000010000000000000003
✅ 总结
| 内容项 | 说明 |
|---|---|
| 启用归档 | 修改 postgresql.conf 中的 archive_mode 和 archive_command |
| 归档目录 | 使用安全权限(700)创建,例如 /data/pg_archive/ |
| 手动归档触发 | SELECT pg_switch_wal(); 强制写入归档 |
| 恢复参数 | 设置 restore_command, recovery_target_timeline 等 |
| 清理策略 | archive_cleanup_command 自动清除无效 WAL |
| 应用场景 | 增量备份、灾难恢复、PITR、主从热备 |

浙公网安备 33010602011771号