PostgreSQL 17增量备份

由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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值