用 rsync 做增量备份:参数与踩坑
用 rsync 做增量备份:参数与踩坑
做运维久了会发现,备份最怕的不是没有备份,而是以为自己有备份。很多人写了一条 rsync 命令放进定时任务,几年都没验证过,等到磁盘坏了才发现备份目录是空的,或者备份的是三年前的旧数据。本文结合一次真实的踩坑经历,讲清楚 rsync 增量备份的常用参数和容易出错的地方。
一、增量备份到底增量了什么
rsync 的增量体现在两个层面。第一次同步会把全部文件复制过去,之后每次运行时,它会先比较源目录和目标目录,只传输新增和发生变化的文件。比较的依据默认是文件大小和修改时间,如果两个都相同,就认为文件没有变过,直接跳过。
这个机制决定了两件事。第一,增量备份很快,适合每天跑;第二,它依赖文件的时间戳和大小来判断变化,所以不要在备份前后随意 touch 文件,也不要用会改写时间戳的同步工具去动备份目录,否则下一次同步会把大量文件重新传一遍。
二、一条够用的备份命令
先看一条最常见的写法:
rsync -av --delete /data/ /backup/data/
其中 -a 是归档模式,相当于递归复制并保留权限、属主、时间戳和符号链接,是备份场景最常用的选项;-v 是输出详细过程,方便看日志;–delete 的意思是让目标目录与源目录保持一致,源目录删掉的文件,在目标目录里也删掉。
这里藏着第一个大坑:源目录末尾的斜杠。/data/ 表示复制 data 目录里面的内容,而 /data 则表示复制 data 这个目录本身。两者只差一个字符,备份出来的目录结构却完全不同。很多人第一次写就因为少了一个斜杠,在目标目录里多套了一层 data,恢复时找半天找不到文件。建议固定一种写法,并在命令后面加注释说明。
三、先演练,再真跑
凡是带 --delete 的命令,第一次跑之前务必加上 --dry-run 先演练一遍:
rsync -av --delete --dry-run /data/ /backup/data/
演练模式只输出将要执行的操作,不真的复制或删除文件。重点看两类输出:有没有不该删的文件出现在删除列表里,有没有不该传的大文件出现在传输列表里。确认无误再去掉 --dry-run 真正执行。这个习惯能拦住绝大多数灾难性误操作,代价只是多花十几秒。
四、把不需要的东西排除掉
备份目录里常常混着缓存、日志和临时文件,这些文件体积大、价值低,备份它们纯属浪费时间和空间。可以用 --exclude 把它们排除:
rsync -av --delete --exclude='*.log' --exclude='cache/' /data/ /backup/data/
排除规则同样容易踩坑。模式是相对于源目录匹配的,cache/ 只会排除各级目录下的 cache 目录,而 /cache 只排除源目录顶层的 cache。写好规则后先用 --dry-run 看一眼,确认排除生效再投入使用。
五、远程备份与断点续传
把数据备份到另一台机器时,rsync 可以直接走 SSH 通道:
rsync -av --delete -e ssh /data/ user@192.168.1.10:/backup/data/
传输大文件时建议加上 --partial,意思是中断后保留已传的部分,下次继续传而不是从头开始。对经常传输几十 GB 文件的场景,这个参数能省下大量时间。第一次使用前先确认目标机器的 SSH 免密登录已经配好,否则定时任务会在半夜等你输密码。
六、我的踩坑清单
第一,方向写反。–delete 会删除目标端多余的文件,如果把源和目标写反,等于把备份删得只剩源目录的一份镜像。每次写完命令,先默念一遍源是哪里、目标是哪里。
第二,权限问题。-a 会保留属主和权限,但如果以普通用户身份运行,遇到 root 拥有的文件会报错或静默跳过。备份系统目录建议用有足够权限的账号跑,并在日志里检查有没有权限不足的报错。
第三,硬链接。有些备份方案用 --link-dest 做多版本快照,每次备份只存变化的文件,未变文件用硬链接指向上一份。这种方式省空间,但恢复时要理解硬链接的语义,误删一个版本不会影响其他版本的数据,因为底层数据块还在。
第四,定时任务的环境差异。在命令行里能跑通的 rsync,放进定时任务可能就失败,常见原因是定时任务的环境变量不同,找不到 rsync 或 ssh。解决办法是在脚本里写绝对路径,并把输出重定向到日志文件,出问题先看日志。
七、备份的最后一步是验证恢复
备份做完不等于备份可用。建议每月抽一次做恢复演练:把备份复制到一台测试目录,对比文件数量、校验几个关键文件的大小和内容,确认能正常打开。演练不用很复杂,花半小时走一遍流程,就能发现备份脚本里的大多数隐患。
小结
用 rsync 做增量备份,核心就四句话:斜杠决定结构,演练先于真跑,排除规则要验证,恢复演练不能省。参数本身并不复杂,复杂的是每一次执行背后的确认动作。把这套流程固定成脚本和检查清单,备份才算真正落地,而不是停留在定时任务里的一行命令上。
- 点赞
- 收藏
- 关注作者
评论(0)