怎样用脚本批量验证备份完整性?

wen 实用脚本 2

本文目录导读:

怎样用脚本批量验证备份完整性?

  1. 使用 MD5/SHA256 校验和验证(最常用)
  2. 使用 rsync 校验验证(适合远程备份)
  3. 使用 tar 归档完整性检查
  4. 数据库备份验证脚本
  5. 综合验证脚本(推荐)
  6. 定时验证配置(cron)
  7. 使用说明
  8. 最佳实践建议

我来介绍几种用脚本批量验证备份完整性的方法,适用于不同场景:

使用 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

使用说明

  1. 赋予执行权限

    chmod +x verify_backup.sh
  2. 运行验证

    ./verify_backup.sh
  3. 查看结果

    cat /var/log/backup_verify/verification_*.log

最佳实践建议

  1. 定期验证:建议每天自动运行验证脚本
  2. 完整校验:验证应包括文件完整性、可恢复性
  3. 日志记录:保留验证日志至少30天
  4. 告警机制:失败时发送通知
  5. 定期测试恢复:定期进行实际恢复测试

这些脚本可以根据你的具体备份类型和需求进行调整,需要我帮你修改成适合特定场景的版本吗?

抱歉,评论功能暂时关闭!