我的 crontab 中有一行简单的 rsync,可以将备份文件从生产服务器传输到另一个服务器。
它似乎触及了目标文件夹中已经存在的文件。这样,备份将在每个间隔内逐渐延长。
请查看以下文件更改的日期和时间。
我如何使用 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
参数)时,它只会下载不存在的新文件并跳过已有的文件。
在调查时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
更新:
这是七月份的文件,我在其中添加了一个额外的空白行,请查看从七月份开始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
答案1
默认情况下,rsync
将读取源和目标上的整个文件,以验证它们是否相同。这不会消耗网络带宽,因为它只会比较哈希值。但它确实会花时间从磁盘读取。
在一种使用场景中,我发现这非常低效,因为源文件仅被附加到。我使用了--size-only
,对我来说效果很好。
还有一些其他选项,看起来可能适用,--append
但--append-verify
我自己还没有测试过。
您的目录看起来不像包含大量小文件的目录,因此从磁盘读取目录列表并统计每个文件的时间应该不会有太大问题。
答案2
我添加了该--ignore-existing
命令,但它看起来不会改变任何东西,只会下载新文件。
rsync -vzr --ignore-existing -e
编辑:当有新文件时,每个周期仍需要更长的时间。
答案3
我认为将其添加-t
到您的论点列表中会有所帮助。
为了验证这一点,你可以添加--itemize-changes
参数(不带-t
)。如果我理解正确的话,这将T
在每一行中显示 -flag
man 1 rspec
:
t 表示修改时间不同,并且正在更新为发送方的值(需要 --times)。T 的替代值表示修改时间将设置为传输时间,当文件/符号链接/设备在未使用 --times 的情况下更新时,以及当符号链接发生更改且接收方无法设置其时间时,就会发生这种情况。(注意:使用 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
答案4
为什么你说每次都要花更长的时间?这怎么可能呢?
也许是生成文件的程序正在接触它们?
尝试--checksum
:根据校验和跳过,而不是修改时间和大小,看看是否改变任何东西(我不会保留这个选项,因为它每次都会从磁盘读取每个文件,太昂贵了,我只是建议它来找到问题。)
(也许尝试使用-t
保留修改时间的选项进行调试)