备份脚本用 rsync -a --delete /mnt/nas/app/ /backup/app/,NAS 挂载点当天没挂上,源目录为空,同步完 /backup/app 被清空,删掉 2.1TB 数据。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
mountpoint -q /mnt/nas || { echo 'nas not mounted'; exit 1; }
rsync -a --delete --max-delete=100 /mnt/nas/app/ /backup/app/
--delete 以源目录为准删除目标多余文件,源为空时目标就被清空。脚本没有检查挂载点,空目录也当成正常源。这一点先确认清楚,后面就不用反复试。
碰到「rsync delete 清空」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,同步前用 mountpoint 检查源目录是否真的挂载;用 --dry-run 先看会删哪些文件;加 --max-delete 限制单次删除数量;保留一份只增不删的副本 作为最后的兜底。
改完照着核一遍,NAS 未挂载时脚本直接退出,/backup/app 的文件数量保持不变。
