由Robert Haas主导提交的增量备份特性是17版本官宣的重量级特性,本文将从特性起源、特性示例、注意事项几方面来进行介绍。
特性起源
对于开发增量备份特性这个项目工程,作者一开始信心满满,项目参与者也是如此。最早计划在13版本实现,但实际开发过程中发现复杂度较高,最终在13版本阶段性完成了备份清单的功能设计以及备份验证工具pg_verifybackup。
从13版本开始,使用pg_basebackup工具执行备份时会自动生成备份清单文件。备份完成之后在备份目录下会存在一个backup_manifest文件,它是一个JSON格式的对象:
- PostgreSQL-Backup-Manifest-Version: 备份清单的版本
- Files: 备份中包含的文件列表,以及每个文件的相对路径,来自PGDATA和重要的元数据,例如大小、最后修改时间和校验和
- WAL-Ranges: 时间线、备份开始的LSN、备份结束的LSN
- Manifest-Checksum: 备份清单文件的校验和
备份清单文件内容示例如下:
{ "PostgreSQL-Backup-Manifest-Version": 1,
"Files": [
{ "Path": "backup_label", "Size": 224, "Last-Modified": "2024-07-10 05:22:40 GMT", "Checksum-Algorithm":"CRC32C", "Checksum": "5a14ed2a" },
...
],
"WAL-Ranges": [
{ "Timeline": 1, "Start-LSN": "0/2000028", "End-LSN": "0/2000100" }
],
"Manifest-Checksum": "1f04834810e2fc9758011503284440d0fb630554f8096b2d4d1aa97eab8c3670"}
而pg_verifybackup可以根据备份清单对备份文件验证其完整性:包括逐个文件的数据块校验和以及包含的WAL记录范围。
又经过多年的酝酿,该项目再次回到主赛道,终于在17版本完成了增量备份的特性提交。
17的实现
基于前面备份清单的铺垫,17里对备份清单增加了系统标识符"System-Identifier"字段来识别增量备份目录,同时备份清单的版本由1变成了2。
{ "PostgreSQL-Backup-Manifest-Version": 2,
"System-Identifier": 7385629747151301033,
"Files": [
{ "Path": "backup_label", "Size": 227, "Last-Modified": "2024-07-10 04:10:51 GMT", "Checksum-Algorithm":"CRC32C", "Checksum": "88d7be8f" },
...
],
"WAL-Ranges": [
{ "Timeline": 1, "Start-LSN": "D/EB000028", "End-LSN": "D/EB000120" }
],
"Manifest-Checksum": "d49de47dc98de594bc4a9c5e011662b2983ead3e116ea66a4eed8af6fa2a1764"}
基于备份清单,发生变化的数据块由新的walsummarizer进程读取WAL并生成summary摘要文件。
walsummarizer进程由GUC参数summarize_wal控制,其生成summary摘要文件(位于pg_wal/
summaries/目录下)由GUC参数wal_summary_keep_time控制清理策略,默认为10天。
summary摘要文件可以使用pg_walsummary工具或相关SQL函数查看。
增量备份示例如下:
1.先需要做一次全备
$ pg_basebackup -c fast -Fp -D sunday
2.增备:基于全备
$ pg_basebackup -c fast -Fp -D monday --incremental=sunday/backup_manifest
3.增备:基于增备
$ pg_basebackup -c fast -Fp -D tuesday --incremental=monday/backup_manifest
4.合并增备:可以合并为周一全备,或合并为周二全备
$ pg_combinebackup sunday monday -o monday_full
$ pg_combinebackup sunday monday tuesday -o tuesday_full
注意合并的备份集需要保持顺序及依赖关系。
5.启动恢复
$ pg_ctl start -D tuesday_full \
-o '-p 5466' -l tuesday_full/logfile
注意事项
- 合并备份的顺序及依赖关系
如果合并备份的顺序不对,或者中间有缺失,或者全备不在最前面,会提示如下相关错误
error: backup at "/.../.../..." is a full backup, but only the first backup should be a full backup
error: backup at "/.../.../..." starts at LSN 0/31000028, but expected 0/35000028
-
备份验证需要在合并备份前
pg_combinebackup工具并不会做文件缺失等验证性工作,文档里清晰的描述,所以在合并备份之前要先使用pg_verifybackup工具对备份进行提前验证。 -
不活跃的standby节点增备可能会报错
standby节点如果比较清闲,standby上的增备因缺乏restartpoint动作会报错:
ERROR: manifest requires WAL from final timeline 1 ending at 0/1967C260, but this backup starts at 0/1967C190
以上是PostgreSQL 17 beta2版本关于增量备份的介绍。
实践总结
第三方的备份工具如pg_probackup、pgbackrest都提供了增量备份的功能。而17版本使用pg_basebackup工具,同时支持全备和增备,但需要注意验证备份集要在合并为全备之前做,同时合并备份要注意备份集的顺序及依赖关系;另外增量备份也支持standby,还需要注意restartpoint的影响,必要时可以在primary和standby分别手工发起一次。
推荐阅读
- PostgreSQL 17增量备份
- PostgreSQL 17 RC1 发布
- PostgreSQL 17 Beta3 发布
- PostgreSQL 17高光特性:原厂locale来了
- PostgreSQL 17开发调试特性|驱逐缓冲
- 默认权限"无法选中"?
- 事件触发器的几点变化
- PostgreSQL 17应用开发篇
- PostgreSQL 17并行特性更新
- PostgreSQL 17新增一道预制菜
- PostgreSQL 17新增Oracle兼容性
- PostgreSQL 17 vacuum功能增强
- PostgreSQL 17优化器相关改进
- PostgreSQL 17新秀参数
- 分区表的两大刚需|拆分分区 |合并分区
- 飘香新特性之Merge语法增强
- 飘香新特性之真实执行计划
- 逻辑复制槽即将支持同步切换
- 回望那那参数翻新之美
- 知兼容性之变,升数据库也稳
- 十大顶尖高手之一吐槽:投身贡献PG的过程相当艰难!
- PG版本新特性,我是如何追的。
与我联系
- 微信公众号:象楚之行
- 墨天轮:https://www.modb.pro/u/15675
- 微信:skypkmoon
勤耕细作,用心积微;静待花开,量变质成。