pg_verifybackup — 验证PostgreSQL集簇基础备份的完整性
pg_verifybackup [option...]
pg_verifybackup用于依据服务器在备份时生成的 backup_manifest,检查使用 pg_basebackup获取的数据库集簇备份的完整性。备份 既可以采用“plain”格式,也可以采用“tar”格式;其中也包括使用 pg_basebackup支持的任意算法压缩的 tar 格 式备份。不过,目前仅支持对 plain 格式备份执行WAL 验证。因此,如果备份采用 tar 格式存储,应使用 -n, --no-parse-wal选项。
需要注意,pg_verifybackup执行的验证并未、也 不可能涵盖运行中的服务器在尝试使用该备份时会执行的每一项检查。即使使 用了此工具,你仍应进行测试恢复,并确认生成的数据库按预期工作且包含正 确的数据。不过,pg_verifybackup能够检测出 许多因存储问题或用户错误而常见的问题。
备份验证分为四个阶段。首先,pg_verifybackup读取 backup_manifest文件。如果该文件不存在、无法读取、 格式不正确、其系统标识符与备份目录中的pg_control 不匹配,或者未能通过其自身内部校验和的验证, pg_verifybackup就会以致命错误终止。
其次,pg_verifybackup将尝试验证当前存储在磁盘上 的数据文件与服务器原本打算发送的数据文件完全一致,但下文所述的少数例 外情况除外。除了少数例外情况之外,多余文件和缺失文件都会被检测出来。 此步骤会忽略postgresql.auto.conf、 standby.signal和recovery.signal 的存在或缺失,以及对它们的任何修改,因为预计这些文件可能是在执行备份 的过程中创建或修改的。它也不会因目标目录中的 backup_manifest文件,或pg_wal 中的任何内容而报告问题,尽管这些文件不会列在备份清单中。这里只检查文 件;除间接情况外,不会验证目录是否存在:如果某个目录缺失,则它本应包 含的任何文件也必然会缺失。
接着,pg_verifybackup会为所有文件计算校验和,将其 与备份清单中的值进行比较,并对计算结果与备份清单中保存的校验和不匹配 的文件报错。对于上一步已产生错误的文件,不会执行这一步,因为这些文件 已经确定存在问题。在上一步中被忽略的文件,在这一步中也会被忽略。
最后,pg_verifybackup会利用备份清单验证从该备份 执行恢复所需的预写式日志记录是否存在,并且能够被读取和解析。 backup_manifest包含关于所需预写式日志记录的信 息,pg_verifybackup会利用这些信息调用 pg_waldump来解析这些预写式日志记录。调用时会使用 --quiet标志,这样pg_waldump 只会报告错误,而不会产生其他输出。这个层次的验证足以发现诸如文件缺失 或文件内部校验和不匹配之类的明显问题,但还不够全面,无法检测恢复时可 能发生的每一种问题。例如,如果服务器中的 bug 生成了校验和正确、但指 定的动作毫无意义的预写式日志记录,这种方法就无法检测出来。
另请注意,如果存在恢复该备份并不需要的额外 WAL 文件,此工具不会检查 它们;不过,可以为此单独调用一次pg_waldump。还要 注意,WAL 验证与版本相关:你必须使用与被检查备份对应版本的 pg_verifybackup,因此也必须使用对应版本的 pg_waldump。相比之下,数据文件完整性检查应当适用 于任何能够生成backup_manifest文件的服务器版本。
pg_verifybackup接受以下命令行参数:
-e--exit-on-error #一旦检测到备份存在问题就立即退出。如果未指定此选项, pg_verifybackup即使在发现问题之后也会继续检 查备份,并将检测到的所有问题报告为错误。
-F format--format=format #指定备份格式。format可以是下列值之一:
-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 文件。如果备份与 WAL 归档分开 存放,这会很有用。
还提供下列其他选项:
要在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
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。