Files
shop-platform/scripts/backup_restore/verify_backup.sh

82 lines
2.2 KiB
Bash

#!/bin/bash
# verify_backup.sh - 验证备份完整性
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
CONFIG_FILE="${SCRIPT_DIR}/backup_config.json"
log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1"; }
verify_backup_integrity() {
local backup_file="$1"
log "验证备份完整性: $backup_file"
# 检查文件是否存在
if [[ ! -f "$backup_file" ]]; then
echo "❌ 备份文件不存在"
return 1
fi
# 检查文件大小
local file_size=$(stat -c%s "$backup_file")
if [[ $file_size -eq 0 ]]; then
echo "❌ 备份文件为空"
return 1
fi
echo "✅ 文件大小: $(numfmt --to=iec-i --suffix=B $file_size)"
# 检查tar归档完整性
if tar -tzf "$backup_file" > /dev/null 2>&1; then
echo "✅ 归档完整性验证通过"
# 统计文件数量
local file_count=$(tar -tzf "$backup_file" | wc -l)
echo "✅ 包含文件数: $file_count"
# 检查长路径文件
local long_path_files=$(tar -tzf "$backup_file" | grep -c '/.\{100,\}')
if [[ $long_path_files -gt 0 ]]; then
echo "📁 长路径文件数: $long_path_files"
fi
return 0
else
echo "❌ 归档损坏或格式错误"
return 1
fi
}
# 主函数
main() {
local backup_file="${1:-}"
if [[ -z "$backup_file" ]]; then
# 使用最新备份
local backup_dir=$(jq -r '.storage.local_path // "/backups"' "$CONFIG_FILE")
backup_file=$(find "$backup_dir" -name "backup_*.tar.gz" -o -name "backup_*.tar.gz.gpg" | sort | tail -1)
if [[ -z "$backup_file" ]]; then
echo "❌ 未找到备份文件"
exit 1
fi
fi
echo "🔍 备份验证报告"
echo "========================================"
echo "备份文件: $backup_file"
echo "验证时间: $(date)"
echo "----------------------------------------"
if verify_backup_integrity "$backup_file"; then
echo "✅ 备份验证通过"
exit 0
else
echo "❌ 备份验证失败"
exit 1
fi
}
main "$@"