本文目录导读:

- 哈希校验(最严格、最通用)
- 文件大小与数量校验(简单快速)
- 数据库级别校验(适用于 MySQL/PostgreSQL)
- 文件结构完整性校验(针对特定格式)
- 逐块比较(高级场景)
- 如何编写一个健壮的校验脚本?
- 总结建议
校验数据完整性是数据恢复中非常关键的一步,脚本可以通过哈希校验、冗余校验码(CRC)、文件结构解析或文件大小/数量对比等方式来实现。
具体使用哪种方式,取决于你恢复的是什么类型的数据(单个文件、数据库文件、还是整个文件系统)以及对完整性的要求(是严格按位一致,还是结构正确即可)。
以下是几种常用的脚本校验方法及实现逻辑:
哈希校验(最严格、最通用)
这是最常用的方法,适用于文件、数据库、压缩包等,通过对比恢复前后的哈希值(如 SHA-256、MD5、SHA-1)来判断数据是否完整。
- 原理:任何比特位的改变都会导致哈希值完全不同。
- 场景:备份恢复、文件复制、数据库导出导入。
脚本逻辑(Bash/Python):
- 恢复前:计算并记录原始数据的哈希值,保存到
checksum.sha256。 - 恢复后:重新计算已恢复数据的哈希值,与记录的哈希值对比。
示例(Bash):
#!/bin/bash
# 使用前:需要先记录原始文件的哈希
# sha256sum original_file.txt > checksum.sha256
target_file="restored_file.txt"
expected_hash=$(cat checksum.sha256 | awk '{print $1}')
# 计算恢复文件的哈希
actual_hash=$(sha256sum "$target_file" | awk '{print $1}')
if [ "$expected_hash" == "$actual_hash" ]; then
echo "校验通过!数据完整。"
else
echo "校验失败!数据可能已损坏。"
exit 1
fi
文件大小与数量校验(简单快速)
适用于恢复大量小文件(如照片库、文档集)的场景。
- 原理:对比源目录和恢复目录的文件总数以及每个文件的大小。
- 风险:无法检测出数据内容错误但大小一致的情况(例如空白扇区填补)。
脚本逻辑(Bash):
#!/bin/bash
source_dir="/mnt/source_backup"
target_dir="/mnt/restored_data"
# 统计文件数量
src_count=$(find "$source_dir" -type f | wc -l)
tgt_count=$(find "$target_dir" -type f | wc -l)
# 统计总大小
src_size=$(du -sb "$source_dir" | awk '{print $1}')
tgt_size=$(du -sb "$target_dir" | awk '{print $1}')
echo "源文件:$src_count 个,总大小:$src_size 字节"
echo "恢复文件:$tgt_count 个,总大小:$tgt_size 字节"
if [ $src_count -eq $tgt_count ] && [ $src_size -eq $tgt_size ]; then
echo "文件数量和大小一致,初步校验通过。"
else
echo "文件数量或大小不一致,数据不完整!"
exit 1
fi
数据库级别校验(适用于 MySQL/PostgreSQL)
如果恢复的是数据库转储文件(.sql)或使用了物理备份(如 XtraBackup),可以借助数据库引擎自身的机制。
- MySQL mysqldump:使用
--checksum-table参数,脚本可以对比备份前后的表校验和。 - PostgreSQL:使用
pg_checksums(如果启用了数据校验和)或对比表的relpages。
脚本逻辑(MySQL):
#!/bin/bash
# 需要 MySQL 权限
# 1. 恢复数据
mysql -u root -p < backup.sql
# 2. 对每个表执行 CHECKSUM TABLE
tables=$(mysql -u root -p -e "SHOW TABLES FROM your_database;" | tail -n +2)
for table in $tables; do
checksum=$(mysql -u root -p -e "CHECKSUM TABLE your_database.$table;" | tail -n 1 | awk '{print $2}')
echo "表 $table 的校验和为: $checksum"
done
文件结构完整性校验(针对特定格式)
适用于图片、视频、压缩包等具有严格内部结构的文件。
- 图片(JPEG/PNG):使用
jpeginfo、ImageMagick(identify -verbose)来读取文件头尾及元数据。 - 压缩包(ZIP/RAR):使用
zip -T或unzip -t验证完整性。 - 视频:使用
ffmpeg -v error -i input.mp4 -f null -
脚本逻辑(Bash):
#!/bin/bash
# 校验所有 ZIP 文件
for zipfile in restored_data/*.zip; do
if unzip -t "$zipfile" > /dev/null 2>&1; then
echo "$zipfile : 结构完整"
else
echo "$zipfile : 结构损坏!"
fi
done
逐块比较(高级场景)
使用 dd 结合 cmp 命令,按块或扇区对两个设备(如磁盘镜像)进行比较,这常用于取证或全盘恢复。
脚本逻辑(Bash - 需要小心操作):
#!/bin/bash
source_device="/dev/sda1"
restored_device="/dev/sdb1"
block_size="1M"
# 使用 cmp 逐块比较
cmp -l "$source_device" "$restored_device" --block-size=$block_size > diff.txt 2>&1
if [ $? -eq 0 ]; then
echo "块级别校验通过,数据完全一致。"
else
echo "存在差异,差异记录在 diff.txt 中。"
fi
如何编写一个健壮的校验脚本?
-
记录元数据:在恢复前,将以下信息记录到日志文件(如
manifest.json):- 文件路径
- 文件大小
- SHA-256 值
- 最后修改时间
- 文件权限
-
容错处理:
- 如果校验失败,脚本不应立即停止,而应记录失败的文件路径,然后继续校验其他文件。
- 使用
set -e时要小心,因为cmp或md5sum在失败时会返回非零。
-
并行处理:对于大量文件,使用
xargs -P或GNU Parallel可以加速校验过程。
# 并行计算 SHA256
find restored_data/ -type f -print0 | xargs -0 -P 4 -I {} sha256sum {} > restored_checksums.txt
总结建议
| 数据类型 | 推荐校验方法 | 脚本工具 |
|---|---|---|
| 重要文档/配置 | SHA-256 | sha256sum, openssl |
| 照片/视频/音乐 | CRC32(快速)+ 格式检查 | crc32, jpeginfo, ffmpeg |
| 数据库备份 | CHECKSUM TABLE |
mysql, psql |
| 压缩包/安装包 | 内建校验 (test) |
unzip -t, tar -W |
| 批量小文件 | 文件数量 + 总大小 | find, du, wc |
| 磁盘镜像/取证 | 块级 cmp / dd |
cmp, dd, md5sum |
最佳实践:
- 先校验原始数据:在开始恢复操作前,务必先生成原始数据的校验清单。
- 分阶段校验:先做快速的大小校验,如果通过,再做深度的哈希校验,以提高效率。
- 记录日志:任何校验结果(无论成功与否)都应记录在日志文件中,方便事后审计。