校验日志自动筛选并重传损坏文件需构建“校验—识别—定位—重传”闭环:输出结构化日志→脚本精准提取失败路径→按文件类型触发对应重传机制→重传后立即校验验证并记录台账。

校验日志自动筛选并重传损坏文件,关键在于把“校验—识别—定位—重传”四个环节串成闭环,而不是靠人工翻日志逐条判断。核心思路是:让校验工具输出结构化日志,用脚本解析异常标记,再调用传输命令精准重传对应文件。
校验阶段必须输出可解析的日志格式
很多工具默认日志是纯文本、无分隔、混杂提示信息,无法直接提取失败项。务必启用结构化输出:
- 使用 SHA-256 校验时加 --json 或 --log=detail 参数(如 rsync -av --checksum --itemize-changes,或 custom script 输出 JSON 行)
- MinIO 迁移用 mc mirror --watch --quiet 配合 --log-level debug,再过滤 ERROR 行;OSS 工具如 ossutil 支持 -v --loglevel warning 并导出为 CSV
- 数据库迁移中,pt-table-checksum 的结果必须写入 checksums 表,并开启 --replicate,后续可 SQL 查询不一致记录
用脚本从日志中精准提取损坏文件路径
不能靠 grep "fail" 粗暴匹配——容易误伤正常警告。应聚焦明确的失败标识:
- 对哈希校验日志:提取含 "mismatch"、"checksum error" 或 "expected: xxx, got: yyy" 的行,再用正则捕获引号内或冒号后的文件路径
- 对对象存储同步日志:过滤 "400 Bad Request"、"500 InternalError"、"invalid object" 对应的 Object Key 字段
- 对数据库校验表:执行 SELECT CONCAT(db,'.',tbl) FROM checksums WHERE this_crc != master_crc,直接生成目标表清单
按类型触发对应重传机制
损坏文件性质不同,重传方式不能一刀切:
- 单个对象/小文件损坏:用原工具命令重传该路径,例如 mc cp minio/bucket/file.txt oss/bucket/
- 数据库某张表校验失败:不重跑全量,而是 drop table target.t1; mydumper -B db1 -T t1 -o /tmp/t1_dump,再 myloader -d /tmp/t1_dump
- 大文件(>100MB)校验失败:优先检查网络和磁盘,改用支持断点续传的协议(如 rclone copy --retries 3 --low-level-retries 10)
- 批量损坏(>5% 文件):暂停自动重传,先查源端是否已损坏(如 file 命令确认是否二进制乱码),避免反复传坏数据
重传后必须闭环验证
重传不是终点,而是新校验的起点:
- 每次重传后,立即对重传项单独运行一次校验命令(如 sha256sum file1 file2 | diff - original.sha256)
- 数据库场景下,重传后必须执行 pt-table-checksum --replicate=percona.checksums --tables=t1 再确认 CRC 一致
- 所有重传动作要写入迁移台账,记录时间、文件名、重传前/后校验值、操作人,支撑审计回溯

















