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

PostgreSQL 17 中的增量备份

原创 王语嫣 2025-04-28
233

数据库管理员(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

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

评论