Skip to content

WAL 与单机可靠性

PostgreSQL 使用 Write-Ahead Logging(WAL)保护数据页变化。修改后的数据页可以延迟写回,但描述该变化的 WAL 必须先到达持久化存储;崩溃恢复再从检查点开始重放 WAL,使文件回到一致状态。


提交与落盘

WAL 是物理变化记录,不是 SQL 审计日志。事务提交确认的严格程度还受 synchronous_commit 和同步复制配置影响;放宽确认条件可以降低延迟,但会扩大实例崩溃或主库故障时的丢失窗口。


检查点与崩溃恢复

检查点把检查点之前需要持久化的脏页推进到数据文件,并在 WAL 中记录一致的恢复起点。检查点越频繁,恢复扫描通常越短,但写入峰值和 WAL Full Page Image 开销可能增加;间隔过大则需要更多 WAL 空间并延长恢复。

实例异常停止后的恢复流程大致为:

text
读取控制信息
→ 定位最近有效检查点
→ 从对应 WAL 位置开始重放
→ 恢复事务与数据页一致状态
→ 开放连接

WAL 能应对进程或操作系统崩溃,不能在数据文件与所需 WAL 同时丢失时凭空恢复数据。


归档、基础备份与 PITR

pg_wal 中的 WAL 段会被循环复用。连续归档把完成的 WAL 段复制到独立归档位置;基础备份提供完整数据文件起点,两者组合可以执行 Point-in-Time Recovery(PITR)。

材料作用
Base Backup提供某一恢复区间的物理文件基线
Archived WAL把基线推进到目标时间或恢复终点
Timeline History描述提升和恢复产生的时间线分支
配置与密钥备份补充 WAL 不记录的外部配置和访问材料

只保存 Base Backup 会损失备份结束之后的变化;只保存 WAL 又缺少可开始重放的数据基线。归档链中缺失一个必需 WAL 段,也可能使恢复无法越过缺口。


单机故障边界

故障单机机制额外措施
Backend Process 异常主进程会终止相关进程并执行恢复排查触发原因和未完成请求
实例或操作系统崩溃WAL 崩溃恢复可靠持久化存储和启动检查
数据盘损坏不能依赖本机自动恢复独立 Base Backup、连续归档和恢复演练
误删、误更新不会自动撤销已提交事务PITR、审计或业务补偿
主机永久故障单机无法自动接管备用节点、故障检测和流量切换
机房故障单故障域无法覆盖异地备份或跨故障域复制

备份与归档若全部位于数据库所在主机或同一存储,只能覆盖有限故障。可靠性应以可验证的 RPO、RTO 和恢复演练衡量,而不是以任务显示“备份成功”衡量。


运行监控

  • pg_wal、归档目标和复制槽保留 WAL 的增长速度。
  • Checkpoint 频率、写入耗时和后台写入压力。
  • 归档失败次数与最近成功归档时间。
  • 数据校验、存储 I/O 错误和文件系统剩余空间。
  • Base Backup、WAL 连续性及定期恢复演练结果。

复制槽可以防止所需 WAL 被回收,但消费者停止时也可能无限保留 WAL,最终占满磁盘。它是保留机制,不是容量保护机制。

参考资料