PostgreSQL 18 预览: 支持验证 tar 格式和压缩的备份

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