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

PolarDB-PG块级增量备份原理简析

PolarDB 2025-06-12
258

PolarDB-PG块级增量备份原理简析

背景

全量备份集大小随着时间日益增长,可能会达到TB量级,每天进行全量备份消耗大量存储空间,备份IO压力大;另外,备份时间长,由于网络问题、数据库不可用引起的备份失败概率也会增大。因此,PolarDB PG设计支持了块级增量备份功能。

原理

减少冗余文件备份,以全量备份集为基础,块级增量备份只备份上一次全量备份/块级增量备份到本次块级增量备份周期内的变化的文件块。

整体流程

备份以7天为一个周期,第1天进行全量备份,第2-7天进行块级增量备份。另外,增量wal日志持续进行归档。

全量恢复,指定某个全量备份集或者块级增量备份进行恢复,如果指定全量备份集,则恢复该全量备份集即可;如果指定块级增量备份集,则需先恢复距离最近的全量备份集,再恢复从最近的全量备份集到当前块级增量备份集之间的所有块级增量备份集,即进行合并操作。

指定时间点恢复,与全量恢复类似。先恢复距离指定时间点最近的全量备份集,再恢复从最近的全量备份集到指定时间点之前所有的块级增量备份集,最后恢复从最后一个块级增量备份集到指定时间点时间所有的wal日志。

详细设计

page变化跟踪

块级增量备份需要跟踪一定周期内文件变化的block,具体方式有以下几种,解析wal日志或者闪回日志,或者通过ptrack,即在pg内核引入记录机制,每次修改文件block的操作都在线记录下来。

a. wal日志解析

解析每一条record,从中找出block变化的信息

image.png

b. 闪回日志解析

PolarDB PG支持闪回功能,而且是基于闪回日志方案实现的。闪回日志索引记录了每个page的变化,因此,理论上通过解析闪回日志索引,便可跟踪page的变化。

c. ptrack

社区提供了ptrack的方案,在page修改时在线记录下来。

https://gist.github.com/lubennikovaav/475a1ac3d394ea08231966a07fecdbde

对比以上几种方案,通过wal日志解析方案比较成熟,对内核的改动相对较少,因此,PolarDB PG采取了wal日志解析方案跟踪page的变化。

块级增量备份

a. select pg_start_backup()

执行checkpoint,产生backup_label文件,设置full page write

b. 备份backup_label文件

记录备份开始的时间、wal日志开始位置等信息

START WAL LOCATION: 13/400024C8 (file 000000020000001300000001)
CHECKPOINT LOCATION: 13/40002530
BACKUP METHOD: pg_start_backup
BACKUP FROM: master
START TIME: 2021-06-21 16:28:22 UTC
LABEL: true
START TIMELINE: 2

c. 备份文件列表

readdir获取当前文件列表

d. 解析本地的记录block变化的文件,备份block

for {
 ok, block := page.datapagemap_next()
 if !ok {
   break
  }

 var hbbuf bytes.Buffer
 var header BackupPageHeader
 header.Block = block
 header.Block_size = 8192

 binary.Write(&hbbuf, binary.LittleEndian, header)

 Copy(tarFile.tw, &hbbuf)

 frontendParam["file"] = frontendFile
 frontendParam["offset"] = block * DefaultBlockSize
 frontend.funcs["seek"](ctx.frontend.handle, frontendParam)

 CopyBufferN(tarFile.tw, frontendReader, buf, DefaultBlockSize)
}

e. 备份pg_control文件

f. select pg_stop_backup()

删除backup_label文件,退出backup状态

g. 备份wal日志文件

备份块级别增量备份期间产生的wal日志。

总结

PolarDB PG块级别增量备份和全量备份过程基本类似,区别是对于数据文件,仅备份发生了变化的page,极大地压缩了需要备份的数据量。


文章转载自PolarDB,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论