搭建 PostgreSQL 时间点恢复(PITR)

适用场景

需要把 PostgreSQL 恢复到误删数据、错误更新或故障发生前的某个时间点。PITR 依赖基础备份和连续 WAL 归档,适合对 RPO 要求较高的生产库。

前置条件

步骤

  1. 配置 WAL 归档:
psql -c "ALTER SYSTEM SET wal_level = replica;"
psql -c "ALTER SYSTEM SET archive_mode = on;"
psql -c "ALTER SYSTEM SET archive_command = 'pgbackrest --stanza=main archive-push %p';"
psql -c "SELECT pg_reload_conf();"
  1. 初始化 pgBackRest 并做基础备份:
pgbackrest --stanza=main stanza-create
pgbackrest --stanza=main check
pgbackrest --stanza=main backup --type=full
pgbackrest info
  1. 确认 WAL 持续归档:
psql -c "SELECT archived_count, failed_count, last_archived_wal FROM pg_stat_archiver;"
pgbackrest --stanza=main check
  1. 模拟误操作前创建还原点:
psql -c "SELECT pg_create_restore_point('before_batch_update');"
  1. 恢复到目标时间点。先停止应用和数据库:
pg_ctl -D /var/lib/postgresql/data stop -m fast
pgbackrest --stanza=main --delta restore
  1. 配置恢复目标:
cat > /var/lib/postgresql/data/postgresql.auto.conf <<'EOF'
restore_command = 'pgbackrest --stanza=main archive-get %f "%p"'
recovery_target_time = '2026-10-18 02:30:00+08'
recovery_target_action = 'promote'
EOF
touch /var/lib/postgresql/data/recovery.signal
  1. 启动并验证:
pg_ctl -D /var/lib/postgresql/data start
psql -c "SELECT pg_is_in_recovery();"
psql -c "SELECT * FROM critical_table LIMIT 10;"

验证

回滚

常见坑

相关命令