时间点恢复的工作原理
快照与历史、恢复窗口、恢复目标与时间线:理解 PITR 的四个核心概念,建立正确的心智模型。
当您不小心删除了数据、表、甚至整个数据库时,时间点恢复(Point-in-Time Recovery,PITR)让您可以回到过去。
—— 这个曾经只有资深 DBA 才能施展的『魔法』,在 Pigsty 的标准配置中零配置开箱即用。
高可用 可以在硬件故障时自动切换主库,让服务免于中断。但它有一个天然的盲区:复制不是备份。
流复制会以毫秒级的延迟,把主库上发生的一切忠实地同步到所有从库 —— 包括那条忘了加 WHERE 的 DELETE,
和那句敲错了目标库的 DROP TABLE。故障切换应对的是"机器坏了";而当"数据错了"的时候,每一个副本上的数据都错得整整齐齐。
数据库的灾难大体可以分为这两类。前者靠冗余解决:多个副本、自动切换,这是高可用的职责范围。 后者的唯一解药是 历史:基础备份与 WAL 归档让数据库回到错误发生之前。这正是时间点恢复所做的事情。
| 威胁 | 高可用 | 延迟集群 | 时间点恢复 |
|---|---|---|---|
| 硬件故障,实例宕机 | ✔ 自动切换 | ✘ | ✔ 但 RTO 较长 |
| 误删数据 / 误删表 / 误删库 | ✘ 错误被复制 | ✔ 延迟窗口内 | ✔ 恢复窗口内任意时刻 |
| 软件缺陷批量污染数据 | ✘ 错误被复制 | ✔ 延迟窗口内 | ✔ 可反复尝试不同时间点 |
| 整个集群 / 机房级灾难 | ✘ | ✘ | ✔ 需使用远程备份仓库 |
三者并非互相替代,而是互相补位:高可用负责秒级止血,延迟集群提供快速反悔窗口,而 PITR 是所有防线失守之后的最终兜底。
PITR 并不神秘。数据库本质上是一台状态机:基础备份 是某个时刻状态的完整快照, WAL(预写式日志)则是此后每一次状态变更的完整历史。拥有一份快照,再加上从快照开始的完整历史, 就可以把数据库重放到这段历史所覆盖的 任意时刻 —— 快照决定了您能回到多早,归档的进度决定了您能回到多近。
基础备份 + WAL 归档 = 时间点恢复
这两样原料的生产在 Pigsty 中都是自动编排的:集群初始化时默认尝试执行首次全量备份,主库持续将 WAL 段文件推送至备份仓库归档; 关于快照、历史、恢复目标与时间线的完整模型,请参阅 工作原理。
在 Pigsty 的标准配置中,PITR 默认启用:每套 PostgreSQL 集群都带有备份仓库、WAL 归档与恢复工具, 由 pgBackRest 驱动。您也可以用几行声明式配置对备份策略进行深度定制:
pg-meta:
hosts: { 10.10.10.10: { pg_seq: 1, pg_role: primary } }
vars:
pg_cluster: pg-meta
pgbackrest_method: minio # 备份写入 MinIO 对象存储仓库(默认为 local 本地仓库)
pg_crontab: [ '00 01 * * * /pg/bin/pg-backup full' ] # 每天凌晨一点执行全量备份
默认使用主库本地磁盘作为备份仓库(/pg/backup),保留最近两个全量备份;每日全备时,恢复窗口约为 24~48 小时。
切换到专用 MinIO 集群或 S3 对象存储后,备份获得独立于数据库主机的故障域与 AES-256 加密;
按时间保留十四天并每周全备时,恢复窗口约为 14~21 天。只要存储管够,恢复窗口丰俭由人。
恢复同样是声明式的:指定恢复目标,剧本完成停库、还原、重放与重建高可用,业务数据由人验证。
./pgsql-pitr.yml -l pg-meta -e '{"pg_pitr": { "time": "2026-07-11 10:00:00+08", "action": "promote" }}'
这个设计与 声明式配置 的理念一脉相承:备份策略是集群定义的一部分, 而"回到过去"也不过是一个 参数。
PITR 为数据安全提供的是 完整性 与 可用性 的跃升:
| 单实例配置策略 | 事件 | RTO | RPO |
|---|---|---|---|
| 什么也不做 | 主机与本地数据同时丢失 | 永久丢失 | 全部丢失 |
| 基础备份 | 主机与本地数据同时丢失 | 取决于备份大小与带宽(几小时) | 丢失上次备份后的数据(几小时到几天) |
| 基础备份 + WAL 归档 | 主机与本地数据同时丢失 | 取决于备份大小与带宽(几小时) | 丢失最后尚未归档的数据 |
而它的代价,则主要落在另外三处:
也要清醒地认识 PITR 的局限:单靠"单机 + PITR",故障时的 RTO 与 RPO 都显著逊色于高可用集群。 所以在严肃的生产环境中,两者应当组合使用 —— 高可用应对硬件故障,PITR 应对删库跑路。
pg_pitr 参数、pgsql-pitr.yml 剧本与 pig pitr 命令行工具具体操作手册请参阅任务层文档 PGSQL 备份恢复。
快照与历史、恢复窗口、恢复目标与时间线:理解 PITR 的四个核心概念,建立正确的心智模型。
Pigsty 以 pgBackRest 为引擎实现 PITR:仓库抽象、归档链路、调度机制,以及"备份跟随主库"的工程设计。
备份是一份保险:备在哪里决定容灾等级,保留多久决定恢复窗口,多久备一次决定恢复速度 —— 三个问题定义一份备份策略。
恢复不该是深夜里的十几步手工操作:用 pg_pitr 参数声明想回到的时刻,由 pgsql-pitr.yml 剧本或 pig 命令行工具编排执行。
误删数据、发布事故、审计取证、机房灾难 —— 事故发生时如何选择恢复目标与恢复方式,以及为什么要把事故排练成例行演练。