Hubert 'depesz' Lubaczewski:期待 PostgreSQL 17 —— 增加对增量备份的支持。

💡 原文英文,约1400词,阅读约需6分钟。
📝

内容提要

2023年12月20日,Robert Haas提交了一个补丁,为增量备份添加了支持。增量备份可以使用新的复制命令UPLOAD_MANIFEST上传先前备份的清单。pg_basebackup现在有一个--incremental=PATH_TO_MANIFEST选项来触发此行为。增量备份类似于常规完整备份,只是一些关系文件被替换为具有INCREMENTAL.${ORIGINAL_NAME}名称的文件,并且backup_label文件包含额外的行标识其为增量备份。新的pg_combinebackup工具可以用于从完整备份和一系列增量备份中重建数据目录。

🔎

延伸解读

增量备份的前提:WAL 汇总必须开启

文章演示了直接使用 pg_basebackup 的 --incremental 选项会报错,提示必须启用 WAL summarization。作者通过 ALTER SYSTEM SET summarize_wal = ON 并重载配置后,增量备份才成功。这意味着在 PostgreSQL 17 中,增量备份并非开箱即用,需要先调整数据库配置。读者在规划备份策略时,应提前确认该参数是否开启,并评估其对系统的影响。

备份体积显著减小,但清单文件数量不变

在作者的测试中,全量备份的 base.tar 约为 40MB,而增量备份的 base.tar 仅约 7MB,体积大幅下降。不过,增量备份的 backup_manifest 中文件条目数量与全量备份相同(均为 1571 个),只是部分文件被标记为 INCREMENTAL 前缀。这说明增量备份通过替换变更文件来节省空间,但清单仍记录所有文件,便于校验和恢复时定位原始文件。

恢复需要组合多个备份,且需先解包

增量备份不能直接恢复,必须使用新的 pg_combinebackup 工具,将全量备份和一系列增量备份组合成完整数据目录。文章指出,该工具要求每个备份目录中包含 PG_VERSION 文件,因此需要先解包 tar 备份并复制 backup_manifest。这增加了恢复步骤的复杂性,读者应提前规划备份存储结构,并熟悉解包与组合流程,以免恢复时手忙脚乱。

❓

Q&A

PostgreSQL 17 中如何创建增量备份?

使用 pg_basebackup 的 --incremental=PATH_TO_MANIFEST 选项,指定先前备份的清单文件路径即可。先前备份可以是完整备份或另一个增量备份。

为什么执行增量备份时提示需要启用 WAL summarization?

增量备份依赖于 WAL 汇总功能,必须设置 summarize_wal = ON 并重新加载配置,否则 pg_basebackup 会报错 'incremental backups cannot be taken unless WAL summarization is enabled'。

增量备份的文件和完整备份有什么不同?

增量备份中,部分关系文件被替换为以 INCREMENTAL. 开头的文件(如 INCREMENTAL.2695),并且 backup_label 文件包含额外行标识其为增量备份。

如何从完整备份和增量备份恢复数据目录?

使用 pg_combinebackup 工具,指定输出目录和按顺序排列的备份目录(完整备份在前,增量备份在后),即可重建数据目录。注意备份需先解包,因为工具要求目录中包含 PG_VERSION 文件。

增量备份能节省多少空间?

在示例中,完整备份的 base.tar 约 40MB,而增量备份的 base.tar 仅约 7MB,显著减小了备份文件大小。

backup_manifest 文件在增量备份中有什么作用?

backup_manifest 文件记录了备份中所有文件的路径、大小、校验和等信息,可用于验证备份完整性,并在增量备份中标识哪些文件是 INCREMENTAL 文件,需要从先前备份中获取。

🏷️

标签

➡️

继续阅读