在任何运行时刻,PostgreSQL 都会在数据目录下的 pg_wal/ 中持续顺序追加写入预写式日志(WAL)。WAL 完整记录了数据文件上发生的一切细微物理变更。结合定期的物理基础全量备份(Base Backup)与源源不断连续生成的 WAL 增量日志段,构成了高可用企业级备份的核心架构:基于时间点恢复(Point-in-Time Recovery,简称 PITR)。
PITR 的核心技术优势包括:
在线热备无需停机:在全量备份制作期间,生产业务读写不受任何阻断。
精准恢复至任意时间瞬间:不仅能恢复至全备点,还能沿着归档的 WAL 增量时间轴重放,精准回滚停留在误操作(如某员工误删核心大表)发生前的最后一毫秒,挽救全部业务数据。
搭建物理热备节点(Hot Standby):持续向备用节点流式推送归档 WAL 日志,能够低延迟维持与主库几乎实时同步的只读从库副本。
在 postgresql.conf 中配置以下核心参数以激活 WAL 连续归档:
wal_level = replica archive_mode = on archive_command = 'test ! -f /mnt/server/archivedir/%f && cp %p /mnt/server/archivedir/%f'
其中 archive_command 是一条 Shell 归档命令字符串,系统在每个 16MB 的 WAL 段文件写满封闭时自动触发调用该命令;%p 会被替换为待归档段文件的完整源路径,而 %f 会被替换为该段文件的文件名。确保归档命令在物理拷贝成功时返回退出码 0,拷贝失败时返回非零退出码。
制作物理基础全备的最简单且标准的方法是使用官方工具 pg_basebackup。它支持在线直连运行中的数据库并生成一致的物理数据快照:
pg_basebackup -h localhost -U replicator -D /backup/base -Fp -Xs -P -v
其中 -Xs 选项确保在备份运行期间将产生的所有 WAL 日志流式打包随同导出,保证备份产物具备完全自闭环的独立一致性。
自 PostgreSQL 17 起,官方工具 pg_basebackup 新增支持原生的物理级增量备份(通过 --incremental 参数)。它利用 WAL 摘要技术,仅提取自上次全备以来发生过实际物理修改的磁盘块,大幅削减海量数据大库的备份存储开销与传输耗时。恢复时利用官方工具 pg_combinebackup 将全备与增量备份合成重建为可直接启动的完整物理集群。
当遭遇灾难性事故需要执行基于时间点的回滚恢复时,标准化运维步骤如下:
安全停止正在运行的异常数据库服务。
将数据目录下残留的最新尚未归档的 pg_wal/ 内容备份暂存到安全位置。
彻底清空当前损坏的数据目录及全部表空间目录。
将最近一份基础全量备份(Base Backup)解压还原到数据目录中,确保文件属主为系统用户 postgres 且权限合规。
将步骤 2 中暂存的未归档 WAL 段文件复制回还原后的 pg_wal/ 中。
在数据目录根目录下创建一个名为 recovery.signal 的空白标识文件(指示实例启动时强制进入恢复重放模式)。
在 postgresql.conf 中指定 WAL 提取还原命令与目标恢复停止时间点:
restore_command = 'cp /mnt/server/archivedir/%f %p' recovery_target_time = '2026-10-15 12:05:00 CST' recovery_target_action = 'promote'
启动数据库服务。实例会检测到 recovery.signal 并自动进入恢复流程,调用 restore_command 从归档池中拉取 WAL 并逐一重放,直至精准抵达 recovery_target_time。完成回放后,系统自动删除 recovery.signal 并将实例提升(Promote)为正常接受读写的生产服务。
在完成基于时间点的恢复并重新接受新事务后,数据库的历史状态实际上分裂出了一条全新的时间分支。为了防止新产生的 WAL 覆盖原时间线上的同名日志段,PostgreSQL 引入了时间线(Timeline)标识机制。每次完成 PITR 提升后,时间线 ID(TLI)会自动递增并生成对应的 .history 历史分支索引文件,使系统能够清晰追溯并支持在复杂的多分支历史轨迹之间任意穿越恢复。