数据库管理员(DBA)或站点可靠性工程师(SRE)的价值取决于他们的最后一次备份,这是千真万确的。PostgreSQL 17 添加了将多个增量备份与全量备份相结合的功能,以便在系统故障时恢复完整的数据字典。使用起来非常方便。
这是一个使用增量备份的快速示例。我建议观看 Robert Haas 的视频,了解更多细节和备份策略的讨论。
第一步:启用 WAL 摘要
增量备份需要写前日志(WAL)摘要。默认情况下,你的实例可能没有启用它,但启用它非常简单。
demo=# alter system set summerize_wal = 'on';
ALTER SYSTEM
demo=# select pg_reload_conf();
pg_reload_conf
----------------
t
(1 行)
第二步:全量备份
以下示例比你在现实生活中遇到的要简单得多。场景是我们在周日进行全量备份,其余时间进行增量备份。周三到周六的备份在此省略。
stoker@ThinkPad:~$ mkdir full monday tuesday
stoker@ThinkPad:~$ pg_basebackup -D full --verbose
密码:
pg_basebackup:正在启动基础备份,等待检查点完成
pg_basebackup:检查点完成
pg_basebackup:写前日志起始点:6/12000028,在时间线 1 上
pg_basebackup:启动后台 WAL 接收器
pg_basebackup:创建临时复制槽“pg_basebackup_21051”
pg_basebackup:写前日志结束点:6/12000158
pg_basebackup:等待后台进程完成流式传输...
pg_basebackup:将数据同步到磁盘...
pg_basebackup:将 backup_manifest.tmp 重命名为 backup_manifest
pg_basebackup:基础备份完成
第三步:第一次增量备份(周一)
在周一,创建第一次增量备份。需要引用包含所有 WAL 信息的清单,这些信息记录了发生了哪些变化。
stoker@ThinkPad:~$ pg_basebackup -D monday -i ./full/backup_manifest --verbose
密码:
pg_basebackup:正在启动基础备份,等待检查点完成
pg_basebackup:检查点完成
pg_basebackup:写前日志起始点:6/14000028,在时间线 1 上
pg_basebackup:启动后台 WAL 接收器
pg_basebackup:创建临时复制槽“pg_basebackup_22703”
pg_basebackup:写前日志结束点:6/14000120
pg_basebackup:等待后台进程完成流式传输...
pg_basebackup:将数据同步到磁盘...
pg_basebackup:将 backup_manifest.tmp 重命名为 backup_manifest
pg_basebackup:基础备份完成
第四步:第二次增量备份(周二)
在周二,创建另一次增量备份。
我们可以仅记录自上次增量备份以来的变化,方法是引用周一目录中的备份清单。在这种情况下,要完全恢复数据,我们需要结合全量备份以及周一和周二的增量备份。这是一种非常有效的操作方式。如果数据变化不大,这可以节省创建增量备份的时间。
我个人更倾向于基于全量备份进行增量备份。这意味着在完全恢复时,只需要使用全量备份和周二的备份。减少逻辑步骤可能看起来微不足道,但在经历了太多凌晨因灾难性系统故障而进行的恢复操作后,我尽量避免引发墨菲定律。
stoker@ThinkPad:~$ pg_basebackup -D tuesday -i ./full/backup_manifest --verbose
密码:
pg_basebackup:正在启动基础备份,等待检查点完成
pg_basebackup:检查点完成
pg_basebackup:写前日志起始点:6/16000028,在时间线 1 上
pg_basebackup:启动后台 WAL 接收器
pg_basebackup:创建临时复制槽“pg_basebackup_22870”
pg_basebackup:写前日志结束点:6/16000120
pg_basebackup:等待后台进程完成流式传输...
pg_basebackup:将数据同步到磁盘...
pg_basebackup:将 backup_manifest.tmp 重命名为 backup_manifest
pg_basebackup:基础备份完成
第五步:合并全量备份、周一和周二的备份
在周二的增量备份之后,你的实例发生了可怕的事情(可能是某个拥有太多实例权限的人再次执行了没有 WHERE 子句的 DELETE 查询)。将数据合并到一个新的目录中非常简单。
stoker@ThinkPad:~$ mkdir newdatadir stoker@ThinkPad:~$ /usr/lib/postgresql/17/bin/pg_combinebackup full tuesday -o newdatadir
第六步:重启
确保将你的新数据目录的权限设置为 700,并且 postgres 账户是其所有者。停止正在运行的实例。你现在可以使用恢复后的数据目录了。将 pg_ctl 指向新的数据目录,一切就绪。
总结
增量备份会让你的生活更轻松,这也是那些尚未升级到 PostgreSQL 17 的用户升级的一个重要原因。
原文地址:https://stokerpostgresql.blogspot.com/2025/04/incremental-backups-in-postgresql-17.html
原文作者:Dave Stokes




