PostgreSQL 17: 增量备份工具 pg_walsummary

John Doe 五月 30, 2025

你想知道每次增量备份中的更改量吗?或者,每次增量备份过程对应的业务压力吗?

在山坡漫步的大象

特性提交日志

添加新的 pg_walsummary 工具。

该工具可转储pg_wal/summaries目录下的 WAL 摘要文件内容。通常情况下,用户可能无需使用此功能,但在调试增量备份问题时可能需要,或可能对外部工具有用。

讨论:http://postgr.es/m/CA+Tgmobvqqj-DW9F7uUzT-cQqs6wcVb-Xhs=w=hzJnXSE-kRGw@mail.gmail.com

示例

在本次提交中,PostgreSQL 新增了一个命令行工具:pg_walsummary。顾名思义,它可以从操作系统的角度获取有关 WAL 摘要文件的信息。让我们从一个包含一些数据的新表开始:

create table x ( a int, b text );
insert into x select i, i::text from generate_series(1,10000) i;
checkpoint;

select pg_relation_filepath('x');
 pg_relation_filepath
----------------------
 base/5/16399
(1 row)

在每次增量备份的过程中,所有更改的块都会列在最后一个 WAL 摘要文件中:

$ cd $PGDATA/pg_wal/summaries/
$ ls -latr
total 92
-rw------- 1 postgres postgres 4808 Mar 18 10:51 00000001000000000100002800000000010B3098.summary
-rw------- 1 postgres postgres 4944 Mar 18 10:51 0000000100000000010B309800000000014E8838.summary
-rw------- 1 postgres postgres   32 Mar 18 10:51 0000000100000000014E883800000000014E8938.summary
-rw------- 1 postgres postgres  230 Mar 18 10:51 0000000100000000014E893800000000014EF360.summary
-rw------- 1 postgres postgres   32 Mar 18 10:51 0000000100000000014EF36000000000014EF460.summary
-rw------- 1 postgres postgres   88 Mar 18 10:51 0000000100000000014EF46000000000014EF798.summary
-rw------- 1 postgres postgres   32 Mar 18 10:51 0000000100000000014EF79800000000014EF810.summary
-rw------- 1 postgres postgres  682 Mar 18 11:11 0000000100000000014EF8100000000001557C00.summary
-rw------- 1 postgres postgres   88 Mar 18 11:14 000000010000000001557C0000000000015598C8.summary
-rw------- 1 postgres postgres 8250 Mar 18 11:23 0000000100000000015598C80000000005290968.summary
-rw------- 1 postgres postgres 8490 Mar 18 11:29 00000001000000000529096800000000077DC3C0.summary
-rw------- 1 postgres postgres  116 Mar 18 11:49 0000000100000000077DC3C000000000077DE570.summary
drwx------ 4 postgres postgres 4096 Mar 18 11:49 ..
-rw------- 1 postgres postgres  434 Mar 18 14:29 0000000100000000077DE57000000000077F4060.summary
-rw------- 1 postgres postgres  584 Mar 18 14:49 0000000100000000077F40600000000007811618.summary
-rw------- 1 postgres postgres  756 Mar 18 15:35 00000001000000000781161800000000078D3198.summary
drwx------ 2 postgres postgres 4096 Mar 18 15:35 .

如果我们将最后一个摘要文件提供给 pg_walsummary,并针对我们的表使用 grep,我们将得到以下信息:

$ pg_walsummary 00000001000000000781161800000000078D3198.summary | grep 16399
TS 1663, DB 5, REL 16399, FORK main: limit 0
TS 1663, DB 5, REL 16399, FORK main: blocks 0..53
TS 1663, DB 5, REL 16399, FORK vm: block 0

这里报告的更改块的数量(0..53)与我们在磁盘上看到的一致:

$ ls -la ../../base/5/16399
-rw------- 1 postgres postgres 442368 Mar 18 15:35 ../../base/5/16399
$ echo "442368/8192" | bc
54

“limit 0” 表示该关系是在这个范围内的 WAL 对应的时间内创建或截断的,“vm” 表示可见性映射

默认情况下,pg_walsummary 会为每个块范围提供一行,但您也可以按单个块列出:

$ pg_walsummary --individual 00000001000000000781161800000000078D3198.summary | grep 16399
TS 1663, DB 5, REL 16399, FORK main: limit 0
TS 1663, DB 5, REL 16399, FORK main: block 0
TS 1663, DB 5, REL 16399, FORK main: block 1
TS 1663, DB 5, REL 16399, FORK main: block 2
TS 1663, DB 5, REL 16399, FORK main: block 3
...
TS 1663, DB 5, REL 16399, FORK main: block 52
TS 1663, DB 5, REL 16399, FORK main: block 53
TS 1663, DB 5, REL 16399, FORK vm: block 0

另一个选择是将所有摘要文件提供给 pg_walsummary:

$ pg_walsummary *
TS 1663, DB 1, REL 112, FORK main: block 0
TS 1663, DB 1, REL 113, FORK main: block 0
TS 1663, DB 1, REL 174, FORK main: block 0
TS 1663, DB 1, REL 175, FORK main: block 0
TS 1663, DB 1, REL 548, FORK main: block 0
TS 1663, DB 1, REL 549, FORK main: block 0
TS 1663, DB 1, REL 827, FORK main: block 0
TS 1663, DB 1, REL 828, FORK main: block 0
TS 1663, DB 1, REL 2187, FORK main: block 0
TS 1663, DB 1, REL 2228, FORK main: blocks 0..1
TS 1663, DB 1, REL 2337, FORK main: block 0
...
TS 1663, DB 5, REL 16402, FORK main: limit 0
TS 1663, DB 5, REL 16403, FORK main: limit 0
TS 1663, DB 5, REL 16403, FORK main: block 0

根据您的兴趣,您现在可以轻松地对输出进行 grep。

虽然很多人不太会每天都使用到 pg_walsummary,但是将其用于故障排除和测试还是很棒的。

感谢所有参与的社区人员。

参考

提交日志:https://git.postgresql.org/pg/commitdiff/ee1bfd168390bc843c6704d16e909692c0a79f27