简单的备份解决方案

zom*_*oma 6 backup cron

我正在为我的 Ubuntu 服务器上的目录寻找一个非常基本的备份脚本/包。目前我正在使用这样的 cronjob:

0 5 * * 1 sudo tar -Pzcf /var/backups/home.tgz /home/
Run Code Online (Sandbox Code Playgroud)

但我想要一个解决方案,为文件名添加时间戳并且不会覆盖旧备份。当然,这会慢慢淹没我的驱动器,因此需要自动删除旧备份(例如超过 2 个月)。

干杯,丹尼斯


更新:我决定为logrotate-solution提供奖励,因为它很简单。但也非常感谢所有其他回答者!

Per*_*uck 5

这是我使用的脚本(的变体) ( /home/pduck/bup.sh):

#!/usr/bin/env bash

src_dir=/home/pduck
tgt_dir=/tmp/my-backups
mkdir -p $tgt_dir

# current backup directory, e.g. "2017-04-29T13:04:50";
now=$(date +%FT%H:%M:%S) 

# previous backup directory
prev=$(ls $tgt_dir | grep -e '^....-..-..T..:..:..$' | tail -1); 

if [ -z "$prev" ]; then
    # initial backup
    rsync -av --delete $src_dir $tgt_dir/$now/
else
    # incremental backup
    rsync -av --delete --link-dest=$tgt_dir/$prev/ $src_dir $tgt_dir/$now/
fi

exit 0;
Run Code Online (Sandbox Code Playgroud)

就我而言,它用于rsync将文件从我的主目录本地复制到备份位置/tmp/my-backups。在该目标目录下创建具有当前时间戳的目录,例如/tmp/my-backups/2018-04-29T12:49:42,在该目录下放置当天的备份。

当脚本再次运行时,它会注意到已经有一个目录/tmp/my-backups/2018-04-29T12:49:42(它选择与时间戳模式匹配的“最新”目录)。然后它执行rsync命令,但这次使用--link-dest=/tmp/my-backups/2018-04-29T12:49:42/开关指向以前的备份。

这是进行增量备份的实际要点:

使用--link-dest=…rsync 不会复制与 link-dest 目录中的文件相比未更改的文件。相反,它只是在当前文件和先前文件之间创建链接。

当你运行这个脚本 10 次时,你会得到 10 个带有不同时间戳的目录,每个目录都保存了当时文件的快照。您可以浏览目录并恢复所需的文件。

内务管理也很容易:只是rm -rf您不想保留的时间戳目录。这不会删除旧的或新的或未更改的文件,只是删除(减少)硬链接。例如,如果您有三代:

  • /tmp/my-backups/2018-04-29T...
  • /tmp/my-backups/2018-04-30T...
  • /tmp/my-backups/2018-05-01T...

并删除第二个目录,然后您只是丢失了当天的快照,但文件仍在第一个或第三个目录(或两者)中。

我在里面放了一个 cronjob /etc/cron.daily,上面写着:

#!/bin/sh
/usr/bin/systemd-cat -t backupscript -p info /home/pduck/bup.sh
Run Code Online (Sandbox Code Playgroud)

命名该文件backup或东西,chmod +x它,但省略.sh后缀(它不会再运行)。由于/usr/bin/systemd-cat -t backupscript -p info您可以通过journalctl -t backupscript.

请注意,由于硬链接,此rsync解决方案要求目标目录位于ext4文件系统上。

  • 我已经根据我的需要采用了这个不错的脚本,并添加了一个 *exclude* 选项(还加上了一些引号):https://paste.ubuntu.com/p/NgfXMPy8pK/ (2认同)

Seb*_*ark 5

使用 logrotate 的简单解决方案

如果您想保持简单且不编写脚本,只需保留当前的 ​​cronjob 并另外为其配置 logrotate 规则。

为此,请将以下内容放入名为 的文件中/etc/logrotate.d/backup-home

/var/backups/home.tgz {
    weekly
    rotate 8
    nocompress
    dateext
}
Run Code Online (Sandbox Code Playgroud)

从现在开始,每次 logrotate 运行时(通常每天早上 6 点 25 分运行),它会检查它是否适合旋转,如果适合,将您的home.tgz文件重命名为添加了时间戳的另一个文件。它将保留它的 8 个副本,因此您大约有两个月的历史记录。

您可以使用dateformat选项自定义时间戳,请参阅logrotate(8)

因为您的备份作业在凌晨 5 点运行,而 logrotate 在早上 6:25 运行,所以您应该确保您的 tar 备份在 1 小时和 25 米之间运行良好(我想无论如何它都会快得多)。