阅读(4414) (14)

PostgreSQ pg_verifybackup

2021-08-23 15:46:55 更新

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

大纲

pg_verifybackup [option...]

简介

pg_verifybackup用于根据备份时服务器生成的backup_manifest检查使用pg_basebackup进行的数据库群集备份的完整性。备份必须以“普通”格式存储;“tar”格式的备份可以在解压缩后进行检查。

需要注意的是,由pg_verifybackup执行的验证不包括也不可能包括运行中的服务器在尝试使用备份时执行的所有检查。 即使使用此工具,也应执行测试还原,并验证生成的数据库是否按预期工作,以及它们是否包含正确的数据。但是,pg_verifybackup可以检测到由于存储问题或用户错误而经常出现的许多问题。

备份验证分四个阶段进行。首先,pg_verifybackup读取backup_manifest文件。如果该文件不存在、无法读取、格式不正确或无法根据其内部校验和进行验证,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 将在检测到问题后继续检查备份,并将检测到的所有问题报告为错误。

-i path
--ignore=path

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

-m path
--manifest-path=path

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

-n
--no-parse-wal

不要试图解析从该备份恢复所需的预写式日志数据。

-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