定期备份 LVM 分区

定期备份 LVM 分区

我有一台小型家庭服务器(Ubuntu Server 17.10),我想为其设置一些备份。我的主要观点是:

  • 服务器有两个硬盘。第一个硬盘(SSD)分区为 EFI 分区和 LVM 空间;里面有两个 LVM 卷,我想备份其中一个。我留出了足够的空间以便在需要时制作快照卷。第二个硬盘有两个分区,我想在需要时挂载第二个分区来存储备份。第二个 HDD 上的这两个分区不属于 LVM 空间
  • 服务器并非 24/7 全天候运行
  • 我想要一些这样的备份:
    • 每天 1.00* 执行增量备份;如果由于 PC 关机而未执行备份,则在准备好时执行
    • 每天最多保留 5* 个增量备份。如果有一天由于 PC 全天关闭而没有执行备份,则应始终保留 5* 个备份。
    • 每个月应该进行一次完整备份(即非增量备份),以防止数据损坏
    • 每月最多保留 3* 次完整备份。第 2 点中解释的概念同样适用(3* 次备份,而不是最近 3* 个月的备份)

注意:备份的时间和数量(以*表示)可以更改。

例如,今天是 14/03。11/03 那天 PC 整天处于关闭状态,因此数据库中应该有:

增量备份:14/03、13/03、12/03、10/03、09/03(如有必要,09/03 也可以完整备份)完整备份:01/03、01/02、01/01

现在,我对此还很陌生,所以我开始四处寻找,然后找到了 Attic 和 Borg。但我不明白我想要实现的目标是否可以通过 Borg 实现,或者是否有比使用此程序更简单的方法来实现(考虑到我在 LVM 上,所以也许我可以使用快照来“跟踪”更改或……等等)。

那么... 我所描述的内容可以在单个(或两个) Borg 脚本中实现吗?您推荐其他工具(或纯文本)吗?或者您认为我描述的策略没用/不够?

谢谢

注意:我错误地在 serverfault 上打开了此帖子,由于我无法移动它,而且没有评论或答案,所以我宁愿删除旧帖子并在这里重新打开,以加快过渡速度,避免将此任务留给版主

编辑:也许我解释得不正确,所以我在这个问题上多加了几行。

我对“增量”快照的经验来自 Virtualbox。在这种情况下,当您删除快照时,修改会被合并。

为了避免写得太多,我使用最多三个每日备份来做一个例子。

假设我们处于以下情况

  • 每日备份 12/03 - 12/03 文件系统的完整副本
  • 每日备份 13/03 - 12/03 至 13/03 之间的修改
  • 每日备份 14/03 - 13/03 至 14/03 之间的修改

今天是新的一天,所以备份开始了。但是已经有 3 个每日备份。因此,12/03 备份和 13/03 备份合并(13/03 差异应用于基础版本),并进行新的增量备份。这样,您会丢失 12 和 13 之间的差异,但备份仍是“完整的”:

  • 每日备份 13/03 - 13/03 文件系统的完整副本
  • 每日备份 14/03 - 13/03 至 14/03 之间的修改
  • 每日备份 15/03 - 14/03 至 15/03 之间的修改

我认为这是 borg prune 的正常行为(如果我错了,请纠正我)

另一个选择(我认为更可取)是合并每月的增量备份。我的意思是:

  • 每月备份 01/03 - 01/03 文件系统的完整副本
  • 每日备份 12/03 - 01/03 至 12/03 之间的修改
  • 每日备份 13/03 - 12/03 至 13/03 之间的修改
  • 每日备份 14/03 - 13/03 至 14/03 之间的修改

修剪时,12 和 13 会合并(因此它变为每日备份 13/03 - 01/03 和 13/03 之间的修改)并创建一个新的。

最后一个选项,在我看来不太可取(但如果你认为它更好,你可以争论这一点)是保留每日备份而不是每月备份。

  • 每月备份 01/03 - 01/03 文件系统的完整副本
  • 每日备份 12/03 - 01/03 至 12/03 之间的修改
  • 每日备份 13/03 - 01/03 至 13/03 之间的修改
  • 每日备份 14/03 - 01/03 至 14/03 之间的修改

在这种情况下,它更简单:只需删除每日备份,而不用回头看。

答案1

您无法真正“合并”备份。这不完全符合您的要求,但这可能符合您的需求。我使用的备份系统是一项涉及汉诺塔模式的cron多层级作业。我相信您可以使用它来确保在系统关闭时安排的运行在下次打开时执行。dumpanacron

#!/bin/bash
set -e
declare -a LEVELMAP=(1 5 4 5 3 5 4 5 2 5 4 5 3 5 4 5 1 5 4 5 3 5 4 5 2 5 4 5 3 5 4 5)
DATE=`date +%-d`
LEVEL=${LEVELMAP[$DATE-1]}
echo Performing a level $LEVEL dump
sync
lvcreate -s -n snap devserv2/root -L 1g
dump -$LEVEL -quz9 -b 1024 -f /backup/dump.$LEVEL /dev/mapper/devserv2-snap
lvremove -f devserv2/snap

dump有级别的概念。级别 0 转储包含所有内容。级别 1 转储包含自上次级别 0 以来更改的所有内容。级别 2 包含自上次级别 0 或级别 1(以较新者为准)以来的所有内容,以此类推。通过在每月的每一天执行列出的级别转储,您会在每月的 1 号和 17 号获得 1 号转储。这些包含自上次级别 0 以来的所有内容,我每隔几个月手动执行一次。每月的其余日子您使用级别 2-5。这意味着在任何时候,您都有 3 个级别的备份,其中包含自每月 1 号或 17 号以来的更改,并且经常更改的文件将有多个版本,您可以在每个备份中返回这些版本,这些版本的年龄从 1 天到几天不等。

相关内容