我在我的crontab中有一个简单的rsync行,从prod服务器获取备份文件到另一个。
它看起来像是触摸目标文件夹中已有的文件。 这样,备份将逐渐花费更长的时间间隔。
请看下面的文件的date和时间已经改变。
如何使用rsync不要触摸(和下载?)它已有的文件。 我不需要计算任何校验和,一旦创build备份,他们将不会再改变。
rsync -vzre 'ssh' stor@server:/backup/system/ /storage/share/Backup/Server
要获取的文件:
-rw-rx--- 1 root stor 896K Jun 22 05:02 giant-140622-etc.zip -rw-rx--- 1 root stor 620K Jun 22 05:02 giant-140622-sql.zip -rw-rx--- 1 root stor 84M Jun 22 05:02 giant-140622-www.zip -rw-rx--- 1 root stor 899K Jun 25 05:00 giant-140625-etc.zip -rw-rx--- 1 root stor 603K Jun 25 05:00 giant-140625-sql.zip -rw-rx--- 1 root stor 84M Jun 25 05:00 giant-140625-www.zip -rw-rx--- 1 root stor 899K Jun 28 05:00 giant-140628-etc.zip -rw-rx--- 1 root stor 620K Jun 28 05:00 giant-140628-sql.zip -rw-rx--- 1 root stor 86M Jun 28 05:00 giant-140628-www.zip -rw-rx--- 1 root stor 899K Jun 30 05:00 giant-140630-etc.zip -rw-rx--- 1 root stor 617K Jun 30 05:00 giant-140630-sql.zip -rw-rx--- 1 root stor 86M Jun 30 05:00 giant-140630-www.zip
目的地:
-rw-rx--- 1 stor stor 896K Jun 30 06:06 giant-140622-etc.zip -rw-rx--- 1 stor stor 620K Jun 30 06:06 giant-140622-sql.zip -rw-rx--- 1 stor stor 84M Jun 30 06:06 giant-140622-www.zip -rw-rx--- 1 stor stor 899K Jun 30 06:06 giant-140625-etc.zip -rw-rx--- 1 stor stor 603K Jun 30 06:06 giant-140625-sql.zip -rw-rx--- 1 stor stor 84M Jun 30 06:06 giant-140625-www.zip -rw-rx--- 1 stor stor 899K Jun 30 06:06 giant-140628-etc.zip -rw-rx--- 1 stor stor 620K Jun 30 06:06 giant-140628-sql.zip -rw-rx--- 1 stor stor 86M Jun 30 06:06 giant-140628-www.zip -rw-rx--- 1 stor stor 899K Jun 30 06:07 giant-140630-etc.zip -rw-rx--- 1 stor stor 617K Jun 30 06:08 giant-140630-sql.zip -rw-rx--- 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-rx--- 1 stor stor 899K Jul 4 06:01 giant-140702-etc.zip -rw-rx--- 1 stor stor 621K Jul 4 06:01 giant-140702-sql.zip -rw-rx--- 1 stor stor 86M Jul 4 06:03 giant-140702-www.zip ^-- 01 to 03 -rw-rx--- 1 stor stor 899K Jul 4 06:04 giant-140704-etc.zip -rw-rx--- 1 stor stor 634K Jul 4 06:05 giant-140704-sql.zip -rw-rx--- 1 stor stor 86M Jul 8 06:02 giant-140704-www.zip ^-- ??? -rw-rx--- 1 stor stor 899K Jul 8 06:03 giant-140706-etc.zip -rw-rx--- 1 stor stor 629K Jul 8 06:03 giant-140706-sql.zip -rw-rx--- 1 stor stor 86M Jul 8 06:06 giant-140706-www.zip ^-- 03 - 06 -rw-rx--- 1 stor stor 899K Jul 8 06:07 giant-140708-etc.zip -rw-rx--- 1 stor stor 629K Jul 8 06:07 giant-140708-sql.zip -rw-rx--- 1 stor stor 86M Jul 8 06:10 giant-140708-www.zip ^-- 07 - 10
现在当我想象再过一个月的时候,时间会是这样的:
-rw-rx--- 1 stor stor 899K Jul 8 06:32 giant-140808-etc.zip -rw-rx--- 1 stor stor 629K Jul 8 06:32 giant-140808-sql.zip -rw-rx--- 1 stor stor 86M Jul 8 06:35 giant-140808-www.zip ^-- what I imagine to happen
默认情况下, rsync将读取源和目标上的整个文件,以validation它们是否相同。 这不消耗networking带宽,因为它只会比较一个散列值。 但它确实花费时间从磁盘读取。
在一个使用场景中,我发现这是非常低效的,因为源文件只被追加到。 我使用的--size-only ,这对我工作得很好。
还有一些其他的选项,看起来可能适用,– --append和--append-verify ,但是我没有自己testing过。
它看起来不像你有一个很多小文件的目录,所以从磁盘读取目录列表和统计每个文件的时间应该不是什么大问题。
我添加了--ignore-existing命令,它看起来不会改变任何东西,只下载新文件。
rsync -vzr --ignore-existing -e
编辑:当有新文件时,每个周期仍然需要更长的时间。
我认为join-t到你的参数列表将会有所帮助。
要validation这一点,你可以添加--itemize-changes – 参数--itemize-changes (不带-t )。 如果我正确地理解了你的话,就会在每一行显示T标志
man 1 rspec :
t表示修改时间不同,正在更新为发件人的值(需要 – 时间)。 T的一个替代值意味着修改时间将被设置为传输时间,当文件/符号链接/设备更新时没有 – 时间和当符号链接改变并且接收器不能设置其时间时发生。 (注意:使用rsync 3.0.0客户端时,您可能会看到s标志与t相结合,而不是正确的T标志,因此时间设置失败。
在这个命令后加上-t (keep --itemize-changes ),你将在每行上收到一个t flag。 在下一次运行中,列表将只包含新文件。
这是我的例子运行:
krissi@host ~/tmp/rsync % l * dst: total 0 src: total 0 -rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar -rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo -rw-r--r-- 1 krissi users 0 Jul 13 18:19 later krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/ sending incremental file list >f+++++++++ bar >f+++++++++ foo >f+++++++++ later sent 174 bytes received 69 bytes 486.00 bytes/sec total size is 0 speedup is 0.00 krissi@host ~/tmp/rsync % l * dst: total 0 -rw-r--r-- 1 krissi users 0 Jul 13 18:21 bar -rw-r--r-- 1 krissi users 0 Jul 13 18:21 foo -rw-r--r-- 1 krissi users 0 Jul 13 18:21 later src: total 0 -rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar -rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo -rw-r--r-- 1 krissi users 0 Jul 13 18:19 later krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/ sending incremental file list >f..T...... bar >f..T...... foo >f..T...... later sent 174 bytes received 69 bytes 486.00 bytes/sec total size is 0 speedup is 0.00 krissi@host ~/tmp/rsync % rsync -vzr --itemize-changes src/ dst/ sending incremental file list >f..T...... bar >f..T...... foo >f..T...... later sent 174 bytes received 69 bytes 486.00 bytes/sec total size is 0 speedup is 0.00 krissi@host ~/tmp/rsync % rsync -vzrt --itemize-changes src/ dst/ sending incremental file list .d..t...... ./ >f..t...... bar >f..t...... foo >f..t...... later sent 177 bytes received 72 bytes 498.00 bytes/sec total size is 0 speedup is 0.00 krissi@host ~/tmp/rsync % rsync -vzrt --itemize-changes src/ dst/ sending incremental file list sent 66 bytes received 12 bytes 156.00 bytes/sec total size is 0 speedup is 0.00 krissi@host ~/tmp/rsync % l * dst: total 0 -rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar -rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo -rw-r--r-- 1 krissi users 0 Jul 13 18:19 later src: total 0 -rw-r--r-- 1 krissi users 0 Jul 13 18:05 bar -rw-r--r-- 1 krissi users 0 Jul 13 18:05 foo -rw-r--r-- 1 krissi users 0 Jul 13 18:19 later
你为什么说每次都需要更长的时间? 这怎么可能?
也许这是生成触摸它们的文件的程序?
尝试使用--checksum :跳过基于校验和,而不是MOD时间和大小,看看是否改变任何东西(我不会保留这个选项,因为它每次从磁盘读取每个文件,太昂贵了,我只是build议它find了问题。)
(也可以尝试使用-t选项进行debugging,这会保留修改时间)