PostgreSQL 物理备份文件即使成功写入磁盘,也可能因为 I/O 抖动、存储设备坏块或者归档介质老化而出现静默损坏。pg_probackup 的 validate 命令可以在不恢复数据库的前提下扫描备份目录,检查数据页结构、页校验和以及备份链依赖,帮助管理员在真正发生故障前识别出不可用备份。对于希望缩短 RTO 并减少人工抽检负担的团队,将完整性验证纳入备份流水线是成本较低且收益明显的做法。

校验过程不会改写有效备份内容,但会顺序读取数据文件,因此生产系统的备份盘如果是机械盘或网络存储,应当合理安排验证时间窗口。接下来从验证维度、命令操作、合并验证和自动化策略几个方面展开。
一、备份完整性的验证维度
pg_probackup 的完整性验证大致可以从三个层面理解。第一个层面是文件级校验,即检查备份目录中的数据文件、控制文件、表空间映射文件和备份元数据是否齐全,文件大小是否与备份时记录一致。第二个层面是页级校验,这是最关键的环节,pg_probackup 会扫描每个数据页的头部和尾部信息,确认页版本、LSN 和校验和是否匹配。如果 PostgreSQL 实例初始化时启用了 data checksums,页校验和可以准确发现磁盘或文件系统中的 bit rot;如果实例没有启用 data checksums,工具仍会进行结构合法性检查,但对静默的位翻转识别能力会明显下降。
第三个层面是备份链校验。对于 page 增量备份或 delta 增量备份,单独的增量文件并不能独立恢复,必须依赖父备份的完整数据页。pg_probackup 在校验时会检查增量备份与其父备份之间的依赖关系,确认父备份状态正常且所需数据页没有丢失。正因为存在这种链式依赖,管理员不能只验证最新的增量备份,还需要关注整条备份链上的父级备份是否通过验证。
除了命令返回信息,show 命令中的 Status 字段也会体现备份状态。一个备份可能显示为 OK、DONE 或 ERROR,但 OK 只表示备份过程结束且元数据记录成功,并不意味着所有数据页都经过深度校验。因此,show 的结果不能替代 validate 的结果,两者在运维脚本中应当分别看待。
二、使用 validate 命令执行完整性检查
在开始验证之前,需要先完成备份目录初始化和实例注册。备份目录是一个独立的元数据存储区域,pg_probackup 会把每个实例的备份信息写入该目录。下面的命令展示了从初始化到全量备份,再到列出备份和校验指定备份的完整流程。
# 初始化备份目录并注册实例 pg_probackup init -B /backup/pgprobackup pg_probackup add-instance -B /backup/pgprobackup --instance=main -D /var/lib/pgsql/14/data # 执行一次全量物理备份 pg_probackup backup -B /backup/pgprobackup --instance=main -b full --stream --temp-slot # 查看备份列表与状态 pg_probackup show -B /backup/pgprobackup --instance=main # 对指定备份 ID 执行完整性校验 pg_probackup validate -B /backup/pgprobackup --instance=main -i SDPZK4
执行 pg_probackup show 后,可以拿到每个备份的 ID、备份模式、状态、起始 LSN、大小和时间信息。建议先根据备份时间和模式确认要验证的目标 ID,再调用 validate 命令。validate 命令支持 -i 参数指定单个备份,也支持 --all 参数对该实例下的所有备份进行连续校验。对于备份数量较多的归档环境,使用 --all 可以配合定期任务一次完成扫描,但耗时会随备份总量线性增长。
校验成功时,pg_probackup 通常返回退出码 0,并在日志中输出该备份有效的信息;校验失败则返回非 0 退出码,同时标记出损坏的数据文件或页号。这个退出码可以直接用于 Shell 脚本的条件判断,无需解析文本输出。如果备份涉及多个表空间,pg_probackup 会逐表空间读取文件,任意一个文件不完整都会导致整体校验失败。
三、合并备份后的二次验证
pg_probackup 的一个突出能力是支持将 page 增量备份合并回父级全量备份,从而减少恢复时需要的备份文件数量,也让备份链更加紧凑。但合并过程本身会重写数据页并更新备份元数据,如果合并期间存储写入不完整或者进程异常中断,合并后的备份可能比合并前更不可靠。因此,在每次执行 merge 之后,都应当立即对生成的备份做一次独立 validate。
# 先执行增量备份 pg_probackup backup -B /backup/pgprobackup --instance=main -b page --stream --temp-slot # 将增量备份合并到父级全量备份 pg_probackup merge -B /backup/pgprobackup --instance=main -i PAGE_BACKUP_ID # 根据 merge 输出获取新的全量备份 ID 后执行校验 pg_probackup validate -B /backup/pgprobackup --instance=main -i MERGED_FULL_ID
merge 命令完成后,可以再次使用 show 命令查看新的全量备份 ID。不要假设旧的父备份 ID 仍然指向合并后的内容,因为 pg_probackup 在合并后可能保留原 ID 或生成新的备份 ID,具体要根据实际版本和命令输出确认。验证合并备份时,重点观察数据页合并是否完整、备份链是否已经被收缩,以及 WAL 记录是否与新的备份元数据一致。
如果合并和验证都放在夜间批处理任务中,建议把 validate 作为 merge 之后的强制下一步,并且只有在 validate 成功后才允许删除旧的增量备份。
pg_probackupPostgreSQL备份备份完整性验证修改时间:2026-08-25 15:08:29