首页/数据/备份与容灾速查/PostgreSQL WAL 归档配置
数据库与云备份56 条

PostgreSQL WAL 归档配置

开启连续归档:写满的 WAL 段被拷贝到独立目录,配合基础备份实现任意时间点恢复;archive_command 返回非 0 时会持续重试。

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

WAL 归档是什么

PostgreSQL 的连续归档把写满的预写日志段复制到独立目录保存。配合一份基础备份,就能把实例恢复到任意时间点:先用基础备份搭出骨架,再让实例按归档顺序回放日志。归档命令返回非零时数据库会持续重试,因此归档一旦长期失败,日志会在数据目录中不断堆积。

基本信息

开启前提日志级别设为可支持归档的档位
生效方式归档模式变更需要重启实例
归档位置独立目录或对象存储,需与数据目录分离
失败行为归档命令返回非零会持续重试,日志持续堆积
监控要点归档成功与失败计数、日志堆积量

postgresql.conf 关键项

postgresql.conf 关键项
wal_level = replica
archive_mode = on
archive_command = 'test ! -f /backup/pg/wal/%f && cp %p /backup/pg/wal/%f'

确认归档状态

确认归档状态
SELECT pg_switch_wal();          -- 手动切换并触发归档(10 及以上版本)
SELECT * FROM pg_stat_archiver;  -- 查看成功与失败计数、最近归档时间

运维要点

  • 归档命令要幂等:先判断目标文件是否已存在,避免重复归档或覆盖
  • 归档目录要与数据目录分离存放,同盘故障会同时损失数据与日志
  • 监控归档失败计数与日志堆积:这两项异常是磁盘被写满的前兆
  • 归档文件建议再做一次异地复制,本地归档目录被删除时仍有退路
  • 定期做时间点恢复演练,验证归档链完整可用,而不是只看到文件数量在增长
归档持续失败时日志会在数据目录中累积并占满磁盘,进而阻塞主库写入;监控归档失败计数是必要项。

归档失败的排查顺序

  • 先看归档目录是否存在且可写:权限变更或目录被清理是最常见原因
  • 再看磁盘空间:归档目标所在卷写满时命令会持续返回失败
  • 检查归档命令本身:路径、环境变量与文件存在性判断都要逐项核对
  • 确认失败计数与日志堆积情况,必要时先临时扩容避免主库被写满
  • 归档恢复后核对补传的日志是否连续,断档会影响时间点恢复

易错点

  • archive_mode 变更需要重启实例才生效
  • archive_command 未检查目标已存在会反复失败:用 test ! -f 形式避免覆盖与重复报错
  • 归档目录与数据目录同盘,磁盘故障时数据与恢复所需日志一起丢失
  • 只开归档不做基础备份:没有基线时归档文件无法独立构成可恢复的实例

数据来源与参考

  • PostgreSQL 文档(Continuous Archiving / archive_command)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌