首页/数据/备份与容灾速查/PostgreSQL 时间点恢复 PITR
数据库与云备份56 条

PostgreSQL 时间点恢复 PITR

恢复基础备份后由 restore_command 拉取归档 WAL 重放,按 recovery_target_time / LSN / name 精确停在指定点;PG12 起用 recovery.signal 触发恢复模式。

备份与容灾速查数据更新于 2026-10-13

PostgreSQL PITR 是什么

时间点恢复先用一份基础备份搭出数据目录骨架,再通过恢复命令从归档目录按顺序拉取预写日志重放,最后停在指定的时间、日志序列号或命名恢复点。从较新版本开始,进入恢复模式由恢复信号文件触发,恢复目标与恢复动作通过配置项声明。

基本信息

前置条件一份基础备份,以及从该备份之后连续的归档日志
停止条件按时间、日志序列号或命名恢复点选择
恢复动作可选提升为可写、暂停等待确认或直接关闭
触发方式恢复信号文件配合实例启动

恢复配置

恢复配置
# postgresql.conf 中设置
restore_command = 'cp /backup/pg/wal/%f %p'
recovery_target_time = '2026-10-12 10:30:00+08'
recovery_target_action = 'promote'

触发恢复

触发恢复
touch /var/lib/pgsql/data/recovery.signal
systemctl start postgresql
# 观察日志中的恢复停止记录
grep -i 'recovery stopping' /var/lib/pgsql/data/log/postgresql-*.log

三种停止方式

方式适用情形注意
目标时间知道误操作发生的大致时刻必须携带时区,否则可能停在错误时间
目标日志序列号已从日志中定位到具体坐标坐标算错会连带重放误操作
命名恢复点变更前主动打了标记需要在业务侧配合预设

使用要点

  • 恢复环境要与新实例一致:版本、配置与归档路径都要核对,避免回放中途失败
  • 恢复日志要保留:日志里记录了停止位置与实际回放范围,是验证的重要证据
  • 目标时间宁早勿晚:停在误操作之前的瞬间,再人工补齐少量数据
  • 演练后清理信号文件与目标参数,否则下次重启会再次进入恢复模式
  • 恢复完成先只读核对,确认数据无误后再开放写入
恢复完成后检查日志中的恢复停止记录,确认停止点符合预期再做业务验证;只看进程启动成功是不够的。

恢复后的检查项

  • 核对实际停止时间与目标时间是否一致,偏差过大要查明原因
  • 检查关键表行数与业务抽检数据是否回到预期状态
  • 确认实例已退出恢复模式并处于可写状态
  • 记录本次恢复用到的日志区间,作为后续演练的参照

易错点

  • 目标时间时区写错会恢复到错误时间点:统一携带时区标注
  • 演练后忘记清理恢复信号文件与目标参数,实例重启会再次进入恢复模式
  • 归档日志不连续时回放在中途停止,得到的是不完整状态
  • 恢复后未做数据核对就开放写入,后续修复需要再次回放整个流程

数据来源与参考

  • PostgreSQL 文档(Recovery Configuration / PITR)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌