由 John Doe 四月 18, 2025
在企业生产环境中,验证数据备份文件的有效性,是保证数据库可靠性的一项关键措施。
特性提交日志
pg_verifybackup
:验证 tar 格式的备份。
这同样适用于已压缩的 tar 格式备份。不过,必须使用-n
选项,因为需要使用pg_waldump
来验证预写式日志(WAL),而它目前还不知道如何验证存储在 tar 文件中的 WAL。
示例
本次提交解决了pg_verifybackup
工具的一个限制:在当前版本(截至版本 17)中,它只能验证使用pg_basebackup
创建的“普通”格式的备份。这意味着,以“tar”或“压缩”格式进行的备份,只有在解包后才能进行验证。从 PostgreSQL 18 开始,这个限制将会被消除。
在 PostgreSQL 17 及之前版本中,如果执行以下操作:
pg17 $ pg_basebackup --version
pg_basebackup (PostgreSQL) 17.4
pg17 $ mkdir /var/tmp/dummy
pg17 $ pg_basebackup --checkpoint=fast --format=t --pgdata=/var/tmp/dummy
pg17 $ ls -l /var/tmp/dummy
total 39620
-rw------- 1 postgres postgres 137808 Mar 30 08:36 backup_manifest
-rw------- 1 postgres postgres 23646720 Mar 30 08:36 base.tar
-rw------- 1 postgres postgres 16778752 Mar 30 08:36 pg_wal.tar
之后尝试验证备份,就会遇到以下情况:
pg17 $ pg_verifybackup /var/tmp/dummy/
pg_verifybackup: error: "pg_wal.tar" is present on disk but not in the manifest
pg_verifybackup: error: "base.tar" is present on disk but not in the manifest
pg_verifybackup: error: "base/4/3431" is present in the manifest but not on disk
pg_verifybackup: error: "base/5/2620" is present in the manifest but not on disk
pg_verifybackup: error: "base/1/2617" is present in the manifest but not on disk
...
pg_verifybackup: error: "base/1/2682" is present in the manifest but not on disk
pg_waldump: error: could not open directory "/var/tmp/dummy/pg_wal": No such file or directory
pg_waldump: hint: Try "pg_waldump --help" for more information.
pg_verifybackup: error: WAL parsing failed for timeline 1
pg17 $ echo $?
1
原因是pg_verifybackup
无法直接检查 tar 文件内容,因此无法验证备份的有效性。
从 PostgreSQL 18 开始,情况会有所不同:
pgdev $ pg_basebackup --version
pg_basebackup (PostgreSQL) 18devel
pgdev $ rm -rf /var/tmp/dummy
pgdev $ pg_basebackup --checkpoint=fast --format=t --pgdata=/var/tmp/dummy
pgdev $ pg_verifybackup --no-parse-wal /var/tmp/dummy/
backup successfully verified
目前需要使用“--no-parse-wal
”选项,因为内部用于验证预写式日志(WAL)的pg_waldump
工具还无法处理压缩或 tar 格式的备份。
这个功能对压缩备份同样有效:
pgdev $ rm -rf /var/tmp/dummy/
pgdev $ pg_basebackup --checkpoint=fast --format=t --compress --pgdata=/var/tmp/dummy
pgdev $ pg_basebackup --checkpoint=fast --format=t --compress=5 --pgdata=/var/tmp/dummy
pgdev $ pg_verifybackup --no-parse-wal /var/tmp/dummy/
backup successfully verified
很高兴看到又一个限制被消除了。感谢社区的所有相关人员。
参考
提交日志:https://git.postgresql.org/pg/commitdiff/8dfd3129027969fdd2d9d294220c867d2efd84aa