pg_verifybackup — 验证一个 PostgreSQL 集群基础备份的完整性
pg_verifybackup [option...]
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.conf、standby.signal 和 recovery.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
可以是以下之一:
pplain备份由普通文件组成,其布局与源服务器的数据目录和表空间相同。
ttar 备份由 tar 文件组成,这些文件可能被压缩。一个有效的备份会把主数据目录放在一个名为 base.tar 的文件中,把 WAL 文件放在 pg_wal.tar 中,并且为每个表空间提供单独的 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 文件。如果备份存储在一个与 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