备份做了却恢复不了等于没做:用 tar + rsync 做一次可验证的备份
备份做了却恢复不了等于没做:用 tar + rsync 做一次可验证的备份
很多人都做过备份:tar 打包、rsync 同步,命令跑完、终端没有报错,就以为万事大吉。真到磁盘坏了、误删了要恢复时,才发现备份包损坏、路径不对、权限丢了,备份等于没做。这篇文章讲一套可验证的备份做法:备份时留校验,恢复前先演练,整个流程只用 tar 和 rsync 两个系统自带工具。
先定一个原则:备份的终点是恢复
写备份脚本之前,先把恢复场景想清楚:你要恢复的是整个目录,还是其中某几个文件?恢复到原位置,还是临时目录?如果答案含糊,备份命令写得再漂亮也没有意义。建议先定三条:备份什么、备份到哪里、多久验证一次。验证不是可选项,没有验证过的备份只能算“可能有用的文件堆”。
第一步:用 tar 做一份带校验的完整备份
tar 的常见写法是 tar -czf backup.tar.gz /data,但这样有几个坑:一是绝对路径恢复时会覆盖原位置,二是没有校验手段,三是出错时不容易发现。改进后的写法是:tar -czf /backup/data-20261103.tar.gz -C / data。-C / data 的意思是先切到根目录再打包相对路径 data,恢复时同样用 -C 指定目标目录,就不会一不小心覆盖线上目录。打包完成后立刻生成校验值:sha256sum /backup/data-20261103.tar.gz > /backup/data-20261103.sha256。校验文件要和备份包放在一起,但不要只放在同一块盘上:如果备份盘本身坏了,校验文件也跟着丢。至少把校验值另外抄一份到别处,比如发到自己的笔记或另一台机器上。
第二步:用 rsync 做增量同步,别当成唯一备份
rsync 适合每天同步变化的部分,命令如:rsync -av --delete /data/ /backup/data-mirror/。-a 保留权限、时间戳和属主,-v 输出过程。–delete 会删除目标端多余的文件,让镜像和源端保持一致——这个选项要格外小心:源端误删一个文件,下一次同步就会把镜像里的对应文件也删掉。所以 rsync 镜像不能当成唯一备份,它只能算“最近状态的副本”。正确的做法是 tar 完整包加 rsync 增量镜像两条线并行:完整包兜底,镜像图方便。另外,rsync 第一次跑之前先加 -n 演练一遍:rsync -avn --delete /data/ /backup/data-mirror/,确认要删、要传的文件都在预期内,再去掉 -n 真跑。很多误删都是一次没演练直接同步造成的。
第三步:恢复演练,至少做到三件事
备份完成当天就做一次恢复演练,不要等到出事。演练不需要停线上服务,步骤是:1. 新建一个临时目录,比如 /tmp/restore-test,把 tar 包解到里面:tar -xzf /backup/data-20261103.tar.gz -C /tmp/restore-test,然后核对关键文件在不在、内容对不对。2. 先校验再解包:sha256sum -c /backup/data-20261103.sha256,输出 OK 才能继续;校验失败就说明包已经损坏,立刻重新备份,不要抱着“也许还能解出来”的侥幸心理。3. 抽查权限和属主:解出来的文件用 ls -l 看一眼,属主、权限是不是和线上一致。只恢复了内容、丢了可执行权限的备份,服务照样起不来。演练通过后,把“演练日期、备份文件名、校验结果”记下来。以后每次恢复出问题,先查这条记录,能省下大量排查时间。
第四步:定一个轮换规则,防止备份盘被塞满
备份最常见的死法不是没做,而是盘满了导致最近一次备份失败,而你几个月都没发现。简单的轮换规则是:每天一份增量镜像,每周一份 tar 完整包,完整包只保留最近四周,超过的删掉。可以用一条命令清理旧包:find /backup -name ‘data-*.tar.gz’ -mtime +28 -delete。删之前同样先加 -print 看一遍清单,确认删的都是旧包。清理脚本第一次跑,一定要在测试目录里试,别直接对正式备份目录下手。
容易踩的几个坑
一是备份了正在被写入的文件:数据库文件、日志文件在打包瞬间可能正在变化,tar 出来的包可能是不一致的快照。这类文件要先停写或用数据库自带的导出工具,tar 只负责打包已经静止的文件。二是备份路径里带了空格或中文,脚本里没有加引号,导致打包漏文件。路径一律用双引号包起来,养成习惯。三是备份脚本跑在 cron 里,失败了没人知道。cron 任务的标准输出和错误要重定向到日志文件,并且每周至少人工看一次日志。脚本最后加一句校验和容量检查:备份包大小是不是 0、校验文件在不在,任何一项异常就写日志告警。
小结
可靠的备份不是一条命令,而是一条链:tar 完整包留底、rsync 镜像图方便、校验值防损坏、恢复演练防“以为有备份”、轮换规则防盘满。今天就可以动手:先给现有备份补一个 sha256,再做一次解到临时目录的演练。如果演练通过,你的备份才算真正成立;如果演练失败,现在发现总比出事时发现好得多。
- 点赞
- 收藏
- 关注作者
评论(0)