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; -- 查看成功与失败计数、最近归档时间运维要点
- 归档命令要幂等:先判断目标文件是否已存在,避免重复归档或覆盖
- 归档目录要与数据目录分离存放,同盘故障会同时损失数据与日志
- 监控归档失败计数与日志堆积:这两项异常是磁盘被写满的前兆
- 归档文件建议再做一次异地复制,本地归档目录被删除时仍有退路
- 定期做时间点恢复演练,验证归档链完整可用,而不是只看到文件数量在增长
归档持续失败时日志会在数据目录中累积并占满磁盘,进而阻塞主库写入;监控归档失败计数是必要项。
归档失败的排查顺序
- 先看归档目录是否存在且可写:权限变更或目录被清理是最常见原因
- 再看磁盘空间:归档目标所在卷写满时命令会持续返回失败
- 检查归档命令本身:路径、环境变量与文件存在性判断都要逐项核对
- 确认失败计数与日志堆积情况,必要时先临时扩容避免主库被写满
- 归档恢复后核对补传的日志是否连续,断档会影响时间点恢复