wal_level必须设为replica或logical;replica支持物理复制和pitr,logical仅用于逻辑解码;修改后需重启,set global无效。

wal_level 设置必须为 replica 或 logical
PostgreSQL 的 WAL 归档和恢复能力直接取决于 wal_level 配置。如果它仍是默认的 minimal,连基础归档都不可用,更别说点对点恢复了。
修改方式:在 postgresql.conf 中设为:
wal_level = replica
注意:replica 已足够支持物理复制与基于时间点(PITR)的恢复;logical 仅在需要逻辑解码时才启用,会额外增加 WAL 体积和写入开销。
- 改完必须重启 PostgreSQL,
SET GLOBAL不生效 - 9.6 之前版本用
archive_mode = on+archive_command才能归档;10+ 版本仍需显式开启归档,否则 WAL 文件会被循环覆盖,无法用于恢复 - 检查是否生效:连接后执行
SHOW wal_level;和SHOW archive_mode;
archive_command 必须可靠且可逆
点对点恢复的前提是 WAL 文件被完整、有序地保存下来。archive_command 就是干这个的,但它一旦失败,PostgreSQL 就会卡住或丢日志。
典型安全写法(以本地归档为例):
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
archive_command = 'test ! -f /var/lib/postgresql/archived_wals/%f && cp %p /var/lib/postgresql/archived_wals/%f'
-
%p是源 WAL 路径,%f是文件名,必须原样保留,不能重命名——恢复时靠名字排序定位顺序 - 命令末尾加
&& sync或使用rsync --sync可降低因系统缓存导致的“看似成功实则未落盘”风险 - 千万别写成
cp %p /some/nfs/mount/...:NFS 等网络文件系统若延迟高或中断,会导致主库事务阻塞甚至崩溃 - 定期用
pg_archivecleanup清理过期 WAL,但别在恢复前删——你永远不确定哪条 WAL 是最后一条
recovery_target_time 必须配合 restore_command 使用
所谓“点对点”,本质就是 PITR(Point-in-Time Recovery),核心靠两个配置协同:restore_command 从归档拉 WAL,recovery_target_time 告诉它停在哪一秒。
恢复前,在数据目录建 recovery.signal(12+)或 recovery.conf(旧版),内容示例:
restore_command = 'cp /var/lib/postgresql/archived_wals/%f %p' recovery_target_time = '2024-05-22 14:30:00+08'
-
restore_command必须可执行、有权限读归档目录、返回非零值表示失败(PostgreSQL 会重试) - 时间必须带时区,否则按服务器本地时区解析,跨时区易错;建议统一用 UTC 存储和指定
- 如果目标时间恰好落在某条 WAL 的中间事务里,PostgreSQL 会回滚到该 WAL 最后一个完整事务,这是预期行为,不是错误
- 恢复完成后,实例自动 shutdown,需手动删掉
recovery.signal并重启才能写入
pg_basebackup 后的 WAL 连续性常被忽略
很多人用 pg_basebackup 做基础备份,却没意识到:备份时刻的 WAL 位置(start_lsn)和归档中第一条 WAL 是否衔接,决定了能否真正恢复到任意时间点。
- 执行
pg_basebackup -Ft -z -D /backup时,务必加-X stream(默认 10+ 版本已启用),否则备份期间产生的 WAL 不会被同步归档,造成断档 - 备份结束后立即查
pg_controldata输出里的Latest checkpoint location,再对比归档目录最早文件名(如00000001000000000000001A),确认数值上连续 - 如果发现归档缺了开头几段 WAL,只能从更早的备份重来,或者用
pg_rewind(但那是另一套逻辑,不适用于严格 PITR 场景)
最常出问题的地方不在语法或命令拼写,而在于归档路径权限不对、archive_command 静默失败、或误删了备份时刻前后几分钟的 WAL 文件——它们不会报错,只会让恢复停在某个奇怪的时间点,且毫无提示。










