2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel

pg_verifybackup

pg_verifybackup — 验证 PostgreSQL 集群的基线备份的完整性

概要

pg_verifybackup [选项...]

描述

pg_verifybackup 用于检查使用 pg_basebackup 拍摄的数据库集群备份是否与服务器在备份时生成的 backup_manifest 一致。备份可以存储为“plain”或“tar”格式;这包括使用 pg_basebackup 支持的任何算法压缩的 tar 格式备份。但是,目前,WAL 验证仅支持 plain 格式备份。因此,如果备份以 tar 格式存储,则应使用 -n, --no-parse-wal 选项。

需要注意的是,pg_verifybackup 执行的验证不包含也不可能包含运行服务器在尝试使用备份时执行的每一项检查。即使您使用此工具,仍应进行测试恢复,并验证由此产生的数据库是否按预期工作,并且它们是否包含正确的数据。但是,pg_verifybackup 可以检测到许多由于存储问题或用户错误而常见的问题。

备份验证分四个阶段进行。首先,pg_verifybackup 读取 backup_manifest 文件。如果该文件不存在、无法读取、格式错误、未能与备份目录的 pg_control 的系统标识符匹配,或者其自身内部校验和验证失败,pg_verifybackup 将以致命错误终止。

其次,pg_verifybackup 将尝试验证磁盘上当前存储的数据文件是否与服务器要发送的数据文件完全相同,但有一些例外情况将在下文描述。将检测到多余的文件和丢失的文件,但有一些例外。此步骤将忽略 postgresql.auto.confstandby.signalrecovery.signal 的存在或缺失,或对它们的任何修改,因为预计这些文件可能是在创建备份过程中创建或修改的。它也不会抱怨目标目录中的 backup_manifest 文件或 pg_wal 中的任何内容,即使这些文件不会在备份清单中列出。仅检查文件;目录的存在或缺失不被验证,但会间接验证:如果目录丢失,其中应包含的任何文件也必然会丢失。

接下来,pg_verifybackup 将对所有文件进行校验和计算,将校验和与清单中的值进行比较,并为计算校验和不匹配清单中存储的值的任何文件发出错误。此步骤不会对上一步中出现错误的任何文件执行,因为它们已知存在问题。上一步中忽略的文件在此步骤中也会被忽略。

最后,pg_verifybackup 将使用清单来验证恢复备份所需的预写日志记录是否存在,并且可以被读取和解析。backup_manifest 包含有关哪些预写日志记录是必需的信息,并且 pg_verifybackup 将使用该信息调用 pg_waldump 来解析这些预写日志记录。--quiet 标志将被使用,因此 pg_waldump 将只报告错误,而不产生任何其他输出。虽然这种级别的验证足以检测明显的错误,例如文件丢失或其内部校验和不匹配,但它们不足以检测恢复时可能发生的每一种可能的错误。例如,无法通过此方法检测到导致具有正确校验和但指定了无意义操作的预写日志记录的服务器错误。

请注意,如果存在不需要恢复备份的多余 WAL 文件,此工具将不会检查它们,尽管可以使用单独调用 pg_waldump 来实现此目的。另请注意,WAL 验证是版本特定的:您必须使用与正在检查的备份相关的 pg_verifybackup 版本,以及因此的 pg_waldump 版本。相比之下,数据文件完整性检查应该适用于生成 backup_manifest 文件的任何服务器版本。

选项

pg_verifybackup 接受以下命令行参数

-e
--exit-on-error

一旦检测到备份问题就退出。如果未指定此选项,pg_verifybackup 将在检测到问题后继续检查备份,并将报告检测到的所有问题作为错误。

-F format
--format=format

指定备份的格式。format 可以是以下之一

p
plain

备份由与源服务器数据目录和表空间具有相同布局的普通文件组成。

t
tar

备份由 tar 文件组成,这些文件可能经过压缩。有效的备份包括名为 base.tar 的主数据目录文件、pg_wal.tar 中的 WAL 文件,以及每个表空间的单独 tar 文件,文件名基于表空间的 OID。如果备份经过压缩,则会将相关的压缩扩展名添加到每个文件名末尾。

-i path
--ignore=path

在将备份中实际存在的数据文件列表与 backup_manifest 文件中列出的文件列表进行比较时,忽略指定的目录或文件,该文件或目录应表示为相对路径名。如果指定了目录,此选项将影响以该位置为根的整个子树。如果相对路径名与指定的路径名匹配,则不会报告关于多余文件、丢失文件、文件大小差异或校验和不匹配的警告。此选项可以指定多次。

-m path
--manifest-path=path

使用指定路径下的清单文件,而不是备份目录根目录下的清单文件。

-n
--no-parse-wal

不要尝试解析恢复此备份所需的预写日志数据。

-P
--progress

启用进度报告。启用此选项将在验证校验和时提供进度报告。

此选项不能与 --quiet 选项一起使用。

-q
--quiet

备份成功验证时,不打印任何内容。

-s
--skip-checksums

不验证数据文件校验和。文件的存在或缺失以及文件大小仍将被检查。这会快得多,因为不需要读取文件本身。

-w path
--wal-directory=path

尝试解析存储在指定目录中的 WAL 文件,而不是 pg_wal。如果备份存储在与 WAL 存档不同的位置,这可能很有用。

还提供其他选项

-V
--version

打印 pg_verifybackup 版本并退出。

-?
--help

显示有关 pg_verifybackup 命令行参数的帮助,然后退出。

示例

创建服务器 mydbserver 的基线备份并验证备份的完整性

$ pg_basebackup -h mydbserver -D /usr/local/pgsql/data
$ pg_verifybackup /usr/local/pgsql/data

创建服务器 mydbserver 的基线备份,将清单移到备份目录之外的某个位置,并验证备份

$ pg_basebackup -h mydbserver -D /usr/local/pgsql/backup1234
$ mv /usr/local/pgsql/backup1234/backup_manifest /my/secure/location/backup_manifest.1234
$ pg_verifybackup -m /my/secure/location/backup_manifest.1234 /usr/local/pgsql/backup1234

验证备份,同时忽略手动添加到备份目录的文件,并跳过校验和验证

$ pg_basebackup -h mydbserver -D /usr/local/pgsql/data
$ edit /usr/local/pgsql/data/note.to.self
$ pg_verifybackup --ignore=note.to.self --skip-checksums /usr/local/pgsql/data

另请参阅

pg_basebackup

提交更正

如果您在文档中看到任何不正确的内容、与您对特定功能的体验不符的内容,或者需要进一步澄清的内容,请使用 此表单 报告文档问题。