rsync同步完两边文件数量大小不一样,先查末尾那个斜杠
用 rsync 把一批业务数据从源机同步到备份机,命令跑完没报错,对账时却傻眼:两边文件数量对不上,目录结构差一层,总大小也不一致。同步工具号称“保证一致”,结果连数量都不齐,是同步坏了,还是数据丢了?多数时候两者都不是——头号嫌疑人,是源路径末尾那一个不起眼的斜杠。
原因分析
rsync 对源路径末尾斜杠的解释是两套语义:写 /data/src/,同步的是这个目录里面的内容,目标端直接收到一批文件;写 /data/src,同步的是 src 这个目录本身,目标端会先建一层 src 再往里装。同一批数据,一个斜杠之差,两边的目录层级就错开一层,数出来的数量自然对不齐。这是 rsync 出了名的语义设计,团队里两种写法混用时,排查起来格外费劲。
除了斜杠,还有几类“数字不一致但并非故障”的情形,逐项认领:排除规则是单边视角,排除掉的文件源端本来就有、目标端永远收不到,数量差是设计使然;硬链接在同步后可能被拆成独立副本,数量不变但字节总数变大;同步中途被中断,目标端会留下隐藏的临时文件,重跑一遍会被清理或续传;至于 du 算出来的大小,不同文件系统的块尺寸不同,同一批文件的账面大小本就有零头差异。
分步解决
- 先对目录层级。把两边 find 输出的目录清单各存一份做对比,确认是不是差一层目录——是,就回到脚本统一斜杠写法,重跑后自然对齐。
- 数量对账。find 配合计数命令两边各数一遍,注意数的是文件还是含目录,口径要一致;差异不大时,用干跑模式列差异清单,逐条认领。
- 干跑预演常态化。正式同步前先干跑一遍并列出变更明细,输出里每个符号都对应一类动作,把预演输出存档,真同步跑完再比对,异常动作当场现形。
- 严格核对用校验和。数量与大小都对上仍不放心,加校验和参数让 rsync 逐文件比对,慢,但能揪出“大小相同内容不同”的静默损坏;定期抽检比全量校验现实。
- 中断残留清理。怀疑上次同步没跑完,重跑同一命令让 rsync 续传清理,不要手工删目标端文件碰运气。
预防
同步脚本入库管理:源端斜杠写法全库统一成一种风格,排除清单写成显式列表并注明每条的用途,脚本头部写一句本次同步的口径说明。贵州诚鑫致达科技交接同步任务时有个小规矩:每次跑完把源与目标的文件数、总字节记进值班本,月底对账翻本子——同步到底靠不靠谱,靠记下来的数字说话,不靠印象。