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_modearchive_command
归档目录 使用安全权限(700)创建,例如 /data/pg_archive/
手动归档触发 SELECT pg_switch_wal(); 强制写入归档
恢复参数 设置 restore_command, recovery_target_timeline
清理策略 archive_cleanup_command 自动清除无效 WAL
应用场景 增量备份、灾难恢复、PITR、主从热备

posted @ 2025-07-06 21:50  kyle_7Qc  阅读(110)  评论(0)    收藏  举报