我的 crontab 中有一个简单的 rsync 行,可以将备份文件从 prod 服务器获取到另一个服务器。
看起来它正在触及目标文件夹中已经存在的文件。这样,备份将逐渐增加每个间隔的时间。
请查看以下文件更改的日期和时间。
如何使用 rsync 不触摸(和下载?)它已经拥有的文件。我也不需要计算任何校验和,一旦创建了备份,它们就不会再改变了。
rsync -vzre 'ssh' stor@server:/backup/system/ /storage/share/Backup/Server
要获取的文件:
-rw-r-x--- 1 root stor 896K Jun 22 05:02 giant-140622-etc.zip
-rw-r-x--- 1 root stor 620K Jun 22 05:02 giant-140622-sql.zip
-rw-r-x--- 1 root stor 84M Jun 22 05:02 giant-140622-www.zip
-rw-r-x--- 1 root stor 899K Jun 25 05:00 giant-140625-etc.zip
-rw-r-x--- 1 root stor 603K Jun 25 05:00 giant-140625-sql.zip
-rw-r-x--- 1 root stor 84M Jun 25 05:00 giant-140625-www.zip
-rw-r-x--- 1 root stor 899K Jun 28 05:00 giant-140628-etc.zip
-rw-r-x--- 1 root stor 620K Jun 28 05:00 giant-140628-sql.zip
-rw-r-x--- 1 root stor 86M Jun 28 05:00 giant-140628-www.zip
-rw-r-x--- 1 root stor 899K Jun 30 05:00 giant-140630-etc.zip
-rw-r-x--- 1 root stor 617K Jun 30 05:00 giant-140630-sql.zip
-rw-r-x--- 1 root stor 86M Jun 30 05:00 giant-140630-www.zip
目的地:
-rw-r-x--- 1 stor stor 896K Jun 30 06:06 giant-140622-etc.zip
-rw-r-x--- 1 stor stor 620K Jun 30 06:06 giant-140622-sql.zip
-rw-r-x--- 1 stor stor 84M Jun 30 06:06 giant-140622-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:06 giant-140625-etc.zip
-rw-r-x--- 1 stor stor 603K Jun 30 06:06 giant-140625-sql.zip
-rw-r-x--- 1 stor stor 84M Jun 30 06:06 giant-140625-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:06 giant-140628-etc.zip
-rw-r-x--- 1 stor stor 620K Jun 30 06:06 giant-140628-sql.zip
-rw-r-x--- 1 stor stor 86M Jun 30 06:06 giant-140628-www.zip
-rw-r-x--- 1 stor stor 899K Jun 30 06:07 giant-140630-etc.zip
-rw-r-x--- 1 stor stor 617K Jun 30 06:08 giant-140630-sql.zip
-rw-r-x--- 1 stor stor 86M Jun 30 06:10 giant-140630-www.zip
更新:
当我从 shell 运行rsync
命令(使用--skip-existing
arg)时,它只下载不存在的新文件并跳过它已有的文件。
在调查由 cronjob 运行的完全相同的命令的行为时,已经存在的文件确实会在每个周期发生变化,并且整个作业在每个周期中花费的时间会逐渐增加(比较上面的时间,cronjob 从 06:00 开始,每个文件 2 分钟,即使它们已经存在)。
rsync -vzr --ignore-existing -e 'ssh -i /path/id_rsa -l backup' [email protected]:/backup/system/ /nfs/share-private/Backup/Server
更新:
这是7月份的文件,我在里面多加了一个空行,请看时代,开始06:01
和提出每个新文件。
-rw-r-x--- 1 stor stor 899K Jul 4 06:01 giant-140702-etc.zip
-rw-r-x--- 1 stor stor 621K Jul 4 06:01 giant-140702-sql.zip
-rw-r-x--- 1 stor stor 86M Jul 4 06:03 giant-140702-www.zip
^-- 01 to 03
-rw-r-x--- 1 stor stor 899K Jul 4 06:04 giant-140704-etc.zip
-rw-r-x--- 1 stor stor 634K Jul 4 06:05 giant-140704-sql.zip
-rw-r-x--- 1 stor stor 86M Jul 8 06:02 giant-140704-www.zip
^-- ???
-rw-r-x--- 1 stor stor 899K Jul 8 06:03 giant-140706-etc.zip
-rw-r-x--- 1 stor stor 629K Jul 8 06:03 giant-140706-sql.zip
-rw-r-x--- 1 stor stor 86M Jul 8 06:06 giant-140706-www.zip
^-- 03 - 06
-rw-r-x--- 1 stor stor 899K Jul 8 06:07 giant-140708-etc.zip
-rw-r-x--- 1 stor stor 629K Jul 8 06:07 giant-140708-sql.zip
-rw-r-x--- 1 stor stor 86M Jul 8 06:10 giant-140708-www.zip
^-- 07 - 10
现在,当我想象再过一个月时,时间会是这样的:
-rw-r-x--- 1 stor stor 899K Jul 8 06:32 giant-140808-etc.zip
-rw-r-x--- 1 stor stor 629K Jul 8 06:32 giant-140808-sql.zip
-rw-r-x--- 1 stor stor 86M Jul 8 06:35 giant-140808-www.zip
^-- what I imagine to happen
默认情况下
rsync
,将读取源和目标上的整个文件,以验证它们是否相同。这不会消耗网络带宽,因为它只会比较哈希值。但它确实花时间从磁盘读取。在一个使用场景中,我发现这非常低效,因为源文件只是被附加到。我使用了
--size-only
,这对我来说效果很好。还有一些其他选项,看起来它们可能适用,
--append
并且--append-verify
,但我自己没有测试过这些选项。看起来您的目录中没有很多小文件,因此从磁盘读取目录列表并统计每个文件的时间应该不是什么大问题。
我添加了
--ignore-existing
命令,看起来它不会改变任何东西,只会下载新文件。编辑:当有新文件时,每个周期仍然需要更长的时间。
我认为添加
-t
到您的论点列表会有所帮助。要验证这一点,您可以添加
--itemize-changes
参数(不带-t
)。如果我理解正确,这将T
在每一行显示 - 标志man 1 rspec
:在此添加
-t
到命令(keep--itemize-changes
)之后,您将在每一行收到一个t
-flag。在下一次运行中,列表将只包含新文件。这是我的示例运行:
为什么你说每次都需要更长的时间?这怎么可能?
也许是生成文件的程序正在触及它们?
尝试
--checksum
:根据校验和跳过,而不是修改时间和大小,看看是否会改变任何东西(我不会保留这个选项,因为它每次都从磁盘读取每个文件,太贵了,我只是建议它找到问题。)(也许尝试使用
-t
保留修改时间的选项进行调试)