使用rsync备份和管理以前的版本/历史

备份与rsync并管理以前的版本/历史

使用备份软件时,大多数使用通用工具rsync。 使用此工具,可以非常容易地在本地或远程主机上同步文件和目录,从而创建副本。 但是大多数人没有管理更改和删除的数据的历史。 删除的文件也将在backupcopy中删除,更改将被覆盖。 本文介绍如何跟踪这些已更改和删除的文件。

一个好的rsync命令是:

rsync --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices %DirToBackup% %BackupTargetDir%

其中%DirToBackup%是要备份的目录,例如主目录/ home / joe。
而%BackupTargetDir%是将该目录复制到的目录,例如/ srv / backupsimple / backup / localhost

请注意,此命令将在目标中创建目录home / joe(因为--relative)选项。

现在这个命令可以做一个副本,但一个真正的备份是别的。 要分析备份,rsync有一个非常方便的选项: - 干运行。 这将执行rsync,但rsync不会执行任何实现。 结合选项--itemize-changes和-out-format,这将为您提供将要执行的操作(删除,覆盖或创建)的详细logreport。

例如,如果在/ src / backupsimple / backup / localhost中没有上述示例目录的/ home / joe,并且/ home / joe的内容如下所示:

/home/joe/DocumentA
          DocumentB
          DocumentC
          DocumentD

然后输出命令

rsync --dry-run --itemize-changes --out-format="%i|%n|" --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost

是:

.d..t......|/home/|
cd+++++++++|/home/joe/|
>f+++++++++|/home/joe/DocumentA|
>f+++++++++|/home/joe/DocumentB|
>f+++++++++|/home/joe/DocumentC|
>f+++++++++|/home/joe/DocumentD|

分析:
- 目录/ home被更改,目录时间,导致backup目录中已经存在主目录(我已经做了我自己的家的备份:/ home / sbon),并且稍后创建dir joe。
- 创建目录/ home / joe:因此第一个c。 第二个d:这是一个dir。
- 创建以下文件:注意起始> f。

做真实备份:

rsync --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost

所以现在在/ srv / backupsimple / backup / localhost中有copy(或者你喜欢的快照)。

现在添加新文件不是重点,而是改变现有文件和/或删除它们。 从更改文件开始。 改变其中之一:

echo "new contents" >> /home/joe/DocumentA

干运行rsync命令给出:

rsync --dry-run --itemize-changes --out-format="%i|%n|" --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost
>f.st......|/home/joe/DocumentA|

分析:
- 你可以看到并且可能期望DocumentA是唯一将被转移的文件。
注意s和t,大小改变和访问/更改时间。

因此,在进行真正的备份之前,首先应该备份DocumentA文件。
为此,请创建一个时间戳记:

timestamp=$(date "+%Y-%m-%d %H:%M:%S")

这看起来像:

2010-04-18 20:55:08

现在创建“历史”树:

install --directory "/srv/backupsimple/history/localhost/$timestamp"
install --directory /srv/backupsimple/log/localhost/

注意引号,它们是时间戳中空间的必要原因。 将文件复制到基于日期的历史树:

echo "/home/joe/DocumentA" > /srv/backupsimple/log/localhost/$timestamp.changed

rsync命令:

rsync --relative --update --perms --owner --group --times --links --super --files-from="/srv/backupsimple/log/localhost/%timestamp.changed" /srv/backupsimple/backup/localhost /srv/backupsimple/history/localhost/$timestamp

这将备份DocumentA文件,因此现在运行原始的rsync命令是安全的。 将被覆盖的文件被复制到一个安全的地方,以后可以查看。

rsync --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost

所以现在我们有一个/ home / joe的快照,在2010年4月18日20:55:08更新,早期版本的/ home / joe / DocumentA。

删除的文件类似:

rm /home/joe/DocumentD
rsync --dry-run --itemize-changes --out-format="%i|%n|" --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost
.d..t......|/home/joe/|
*deleting |home/joe/DocumentD|

分析此输出:
- / home / joe的目录时间被更改,当文件被删除时总是这样。
- 当然文件DocumentD被报告为已删除。

创建一个新的时间戳:

timestamp=$(date "+%Y-%m-%d %H:%M:%S")
echo $timestamp
2010-04-18 20:56:30

创建历史目录:

install --directory "/srv/backupsimple/history/localhost/$timestamp"

echo "/home/joe/DocumentD" > /srv/backupsimple/log/localhost/$timestamp.deleted

用于备份备份的rsync命令是:

rsync --relative --update --perms --owner --group --times --links --super --files-from="/srv/backupsimple/log/localhost/%timestamp.deleted" /srv/backupsimple/backup/localhost /srv/backupsimple/history/localhost/$timestamp

并且这个命令之后再一次真正的rsync命令:

rsync --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices /home/joe /srv/backupsimple/backup/localhost

广义的方法

当写一个执行上述内容的脚本时,必须推广一些事情。

首先设置一些变量:

DirToBackup=/home/joe
timestamp=$(date "+%Y-%m-%d %H:%M:%S")
install --directory "/srv/backupsimple/history/localhost/$timestamp"
install --directory /srv/backupsimple/backup/localhost/
install --directory /srv/backupsimple/log/localhost/

做干运行并将输出写入文件:

rsync --dry-run --itemize-changes --out-format="%i|%n|" --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices $DirToBackup /srv/backupsimple/backup/localhost | sed '/^ *$/d' > "/srv/backupsimple/log/localhost/$timestamp.dryrun"

注意:sed命令删除空行。

现在,当您查看dryrun文件的格式时,创建,删除和更改的项目是:

创建和更改文件:

grep "^.f" "/srv/backupsimple/log/localhost/$timestamp.dryrun" >> "/srv/backupsimple/log/localhost/$timestamp.onlyfiles"
grep "^.f+++++++++" "/srv/backupsimple/log/localhost/$timestamp.onlyfiles" | awk -F '|' '{print $2 }' | sed 's@^/@@' >> "/srv/backupsimple/log/localhost/$timestamp.created"
grep --invert-match "^.f+++++++++" "/srv/backupsimple/log/localhost/$timestamp.onlyfiles" | awk -F '|' '{print $2 }' | sed 's@^/@@" >> "/srv/backupsimple/log/localhost/$timestamp.changed"

一些注释:
- 各种sed命令是必要的,以删除起始斜杠使它们相对而不是绝对的
- grep命令(^ .f)中的点在这里是一个正则表达式表达式,不应该在字面上

创建和更改目录:

grep "^\.d" "/srv/backupsimple/log/localhost/$timestamp.dryrun" | awk -F '|' '{print $2 }' | sed -e 's@^/@@' -e 's@/$@@' >> "/srv/backupsimple/log/localhost/$timestamp.changed"
grep "^cd" "/srv/backupsimple/log/localhost/$timestamp.dryrun" | awk -F '|' '{print $2 }' | sed -e 's@^/@@' -e 's@/$@@' >> "/srv/backupsimple/log/localhost/$timestamp.created"

一些注释:
- 各种sed命令是必要的,以删除路径末尾的起始斜线和斜线,再次使它们相对并阻止“递归”行为,rsync对此很敏感
- grep命令中的点(^ \。d)应该是字面上的

已删除的文件和目录:

grep "^*deleting" "/srv/backupsimple/log/localhost/$timestamp.dryrun" | awk -F '|' '{print $2 }' >> "/srv/backupsimple/log/localhost/$timestamp.deleted"

笔记:
- 路径不以斜杠开始,因此不需要删除它们
- 尾部斜线在这里是无害的:删除一个dir意味着总是递归

所以现在有$ timestamp.created,$ timestamp.changed和$ timestamp.deleted这些文件。

具有创建项目的文件仅在此用于记录。 您不能也不必备份尚未创建的文件!

猫改变和删除的项目在一起:

cat "/srv/backupsimple/log/localhost/$timestamp.deleted" > /tmp/tmp.rsync.list
cat "/srv/backupsimple/log/localhost/$timestamp.changed" >> /tmp/tmp.rsync.list
sort --output=/tmp/rsync.list --unique /tmp/tmp.rsync.list

现在做备份的备份:

rsync --relative --update --perms --owner --group --times --links --super --files-from=/tmp/rsync.list /srv/backupsimple/backup/localhost/ "/srv/backupsimple/history/localhost/$timestamp"

最后做真正的备份:

rsync --relative --recursive --update --delete --perms --owner --group --times --links --safe-links --super --one-file-system --devices $DirToBackup /srv/backupsimple/backup/localhost

一个注释,我从脚本复制了这些命令。 可能会有一些错误,但是我的希望很清楚。

本地和远程

以上描述了如何在本地进行备份,但也很有可能备份到运行rsync deamon的远程主机。 它需要一个更复杂的配置。 不做dryrun和realbackup,它们很简单,但它是备份备份的步骤。 具有创建,更改和删除的项目的各种文件位于本地主机上,而此步骤应在远程主机上执行。

有多种方法可以解决这个问题。 其中一个是使用sshfs装载远程主机,localhost可以像备份本地一样执行备份。

一个更好的(imho)解决方案是在rsync服务器(除了备份和历史共享之外)之间创建一个分开的“队列”共享,其中要备份的备份项目的文件应该被同步。 rsync服务器可以运行脚本和脚本。 当本地主机尝试执行realbackup时,预先脚本应该检查队列中是否列出应该首先处理的列表。 如果是这样,它将首先执行此步骤。 本地主机上的rsync命令只会等到预先完成。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏