暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

PostgreSQL 17增量备份

原创 彭冲 2024-08-05
1099

由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分别手工发起一次。

推荐阅读

与我联系

  • 微信公众号:象楚之行
  • 墨天轮:https://www.modb.pro/u/15675
  • 微信:skypkmoon

勤耕细作,用心积微;静待花开,量变质成。

最后修改时间:2024-08-08 22:58:01
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论