本文目录导读:

- 使用 MD5/SHA256 校验和验证(最常用)
- 使用 rsync 校验验证(适合远程备份)
- 使用 tar 归档完整性检查
- 数据库备份验证脚本
- 综合验证脚本(推荐)
- 定时验证配置(cron)
- 使用说明
- 最佳实践建议
我来介绍几种用脚本批量验证备份完整性的方法,适用于不同场景:
使用 MD5/SHA256 校验和验证(最常用)
备份时生成校验文件
#!/bin/bash
# backup_with_checksum.sh
BACKUP_DIR="/backups"
CHECKSUM_FILE="${BACKUP_DIR}/checksums.md5"
# 生成所有备份文件的MD5校验和
find ${BACKUP_DIR} -type f -name "*.tar.gz" -o -name "*.sql" | \
while read file; do
md5sum "$file" >> ${CHECKSUM_FILE}
done
echo "校验和文件生成完成: ${CHECKSUM_FILE}"
验证脚本
#!/bin/bash
# verify_backup.sh
BACKUP_DIR="/backups"
CHECKSUM_FILE="${BACKUP_DIR}/checksums.md5"
if [ ! -f "$CHECKSUM_FILE" ]; then
echo "错误: 校验和文件不存在!"
exit 1
fi
# 验证所有文件完整性
cd ${BACKUP_DIR}
md5sum -c ${CHECKSUM_FILE} --quiet 2>&1 | \
while read line; do
if echo "$line" | grep -q "FAILED"; then
echo "警告: 文件校验失败: $line"
# 记录失败详情
echo "$(date): $line" >> verification_failures.log
else
echo "通过: $line"
fi
done
# 统计结果
PASSED=$(grep -c "OK$" "${CHECKSUM_FILE}")
FAILED=$(grep -c "FAILED$" "${CHECKSUM_FILE}")
echo "验证完成: 通过 ${PASSED} 个, 失败 ${FAILED} 个"
使用 rsync 校验验证(适合远程备份)
#!/bin/bash
# rsync_verify.sh
SOURCE_DIR="/data/backups"
REMOTE_HOST="backup-server"
REMOTE_DIR="/remote/backups"
LOG_FILE="/var/log/backup_verify.log"
# 使用 rsync 进行校验验证
rsync -avc --dry-run --delete \
${SOURCE_DIR}/ \
${REMOTE_HOST}:${REMOTE_DIR}/ \
>> ${LOG_FILE} 2>&1
# 检查是否有差异
if grep -q "file has vanished" ${LOG_FILE}; then
echo "警告: 发现文件差异" | tee -a ${LOG_FILE}
exit 1
fi
echo "备份完整性验证通过" | tee -a ${LOG_FILE}
使用 tar 归档完整性检查
#!/bin/bash
# tar_verify.sh
BACKUP_DIR="/backups"
LOG_FILE="/var/log/tar_verify.log"
# 验证所有 tar 文件
for tarfile in ${BACKUP_DIR}/*.tar.gz ${BACKUP_DIR}/*.tar; do
if [ -f "$tarfile" ]; then
echo "验证: $tarfile"
# 检查 tar 文件完整性
if gzip -t "$tarfile" 2>/dev/null; then
tar -tzf "$tarfile" > /dev/null 2>&1
if [ $? -eq 0 ]; then
echo " 通过: tar 文件完整" >> ${LOG_FILE}
else
echo " 失败: tar 文件损坏" >> ${LOG_FILE}
fi
else
echo " 失败: gzip 压缩损坏" >> ${LOG_FILE}
fi
fi
done
数据库备份验证脚本
#!/bin/bash
# db_verify.sh
BACKUP_DIR="/backups/mysql"
LOG_FILE="/var/log/db_verify.log"
for sqlfile in ${BACKUP_DIR}/*.sql ${BACKUP_DIR}/*.sql.gz; do
if [ -f "$sqlfile" ]; then
echo "验证: $sqlfile"
# 解压并检查SQL语法
if [[ "$sqlfile" == *.gz ]]; then
gunzip -c "$sqlfile" | mysql --force --check-only 2>&1
else
mysql --force --check-only < "$sqlfile" 2>&1
fi
if [ $? -eq 0 ]; then
echo " SQL语法正确" >> ${LOG_FILE}
else
echo " SQL语法错误" >> ${LOG_FILE}
fi
fi
done
综合验证脚本(推荐)
#!/bin/bash
# comprehensive_backup_verify.sh
BACKUP_DIR="/backups"
LOG_DIR="/var/log/backup_verify"
DATE=$(date +%Y%m%d_%H%M%S)
RESULT_FILE="${LOG_DIR}/verification_${DATE}.log"
# 创建日志目录
mkdir -p ${LOG_DIR}
# 验证函数
check_backup() {
local file=$1
local status="未知"
echo "==========================================" | tee -a ${RESULT_FILE}
echo "验证: $file" | tee -a ${RESULT_FILE}
echo "时间: $(date)" | tee -a ${RESULT_FILE}
# 1. 文件存在性检查
if [ ! -f "$file" ]; then
echo "状态: 文件不存在" | tee -a ${RESULT_FILE}
return 1
fi
# 2. 文件大小检查(非空)
if [ ! -s "$file" ]; then
echo "状态: 文件为空" | tee -a ${RESULT_FILE}
return 1
fi
# 3. 根据文件类型进行验证
case "$file" in
*.tar.gz|*.tgz)
gzip -t "$file" && tar -tzf "$file" > /dev/null 2>&1
status=$? ;;
*.tar)
tar -tf "$file" > /dev/null 2>&1
status=$? ;;
*.gz)
gzip -t "$file"
status=$? ;;
*.zip)
unzip -t "$file" > /dev/null 2>&1
status=$? ;;
*.sql|*.sql.gz)
# SQL文件语法检查(可选)
# 需要安装 mysql-client
if command -v mysql &> /dev/null; then
if [[ "$file" == *.gz ]]; then
gunzip -c "$file" | mysql --force --check-only 2>&1
else
mysql --force --check-only < "$file" 2>&1
fi
status=$?
else
status=0
fi ;;
*)
# 其他文件使用 md5sum 验证
md5sum "$file" | tee -a ${RESULT_FILE}
status=$? ;;
esac
if [ $status -eq 0 ]; then
echo "状态: 通过" | tee -a ${RESULT_FILE}
return 0
else
echo "状态: 失败" | tee -a ${RESULT_FILE}
return 1
fi
}
# 主程序
echo "备份完整性验证报告" > ${RESULT_FILE}
echo "生成时间: $(date)" >> ${RESULT_FILE}
echo "==========================================" >> ${RESULT_FILE}
PASSED=0
FAILED=0
TOTAL=0
# 遍历所有备份文件
find ${BACKUP_DIR} -type f \( \
-name "*.tar.gz" -o \
-name "*.tgz" -o \
-name "*.tar" -o \
-name "*.gz" -o \
-name "*.zip" -o \
-name "*.sql" -o \
-name "*.sql.gz" \
\) | while read file; do
TOTAL=$((TOTAL + 1))
if check_backup "$file"; then
PASSED=$((PASSED + 1))
else
FAILED=$((FAILED + 1))
echo "失败: $file" >> verification_failures.log
fi
done
echo "==========================================" | tee -a ${RESULT_FILE}
echo "验证总结:" | tee -a ${RESULT_FILE}
echo "总计: ${TOTAL} 个文件" | tee -a ${RESULT_FILE}
echo "通过: ${PASSED} 个" | tee -a ${RESULT_FILE}
echo "失败: ${FAILED} 个" | tee -a ${RESULT_FILE}
# 发送通知(可选)
if [ ${FAILED} -gt 0 ]; then
echo "部分备份文件验证失败,请检查日志: ${RESULT_FILE}" | \
mail -s "备份验证失败警告" admin@example.com
fi
echo "验证完成! 日志文件: ${RESULT_FILE}"
定时验证配置(cron)
# crontab -e 添加以下内容 # 每天凌晨2点验证备份完整性 0 2 * * * /usr/local/bin/comprehensive_backup_verify.sh # 每周日深入验证 0 3 * * 0 /usr/local/bin/comprehensive_backup_verify.sh --full-verify
使用说明
-
赋予执行权限:
chmod +x verify_backup.sh
-
运行验证:
./verify_backup.sh
-
查看结果:
cat /var/log/backup_verify/verification_*.log
最佳实践建议
- 定期验证:建议每天自动运行验证脚本
- 完整校验:验证应包括文件完整性、可恢复性
- 日志记录:保留验证日志至少30天
- 告警机制:失败时发送通知
- 定期测试恢复:定期进行实际恢复测试
这些脚本可以根据你的具体备份类型和需求进行调整,需要我帮你修改成适合特定场景的版本吗?