我正在为我的 Ubuntu 服务器上的目录寻找一个非常基本的备份脚本/包。目前我正在使用这样的 cronjob:
0 5 * * 1 sudo tar -Pzcf /var/backups/home.tgz /home/
Run Code Online (Sandbox Code Playgroud)
但我想要一个解决方案,为文件名添加时间戳并且不会覆盖旧备份。当然,这会慢慢淹没我的驱动器,因此需要自动删除旧备份(例如超过 2 个月)。
干杯,丹尼斯
更新:我决定为logrotate
-solution提供奖励,因为它很简单。但也非常感谢所有其他回答者!
这是我使用的脚本(的变体) ( /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
文件系统上。
如果您想保持简单且不编写脚本,只需保留当前的 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 米之间运行良好(我想无论如何它都会快得多)。
归档时间: |
|
查看次数: |
3249 次 |
最近记录: |