#!/bin/bash # ====== 备份验证脚本 ====== # 每周日凌晨 04:00 自动运行 # 验证备份完整性,解压测试 SQLite 数据库 set -e DATE=$(date +%Y%m%d) VERIFY_DIR="/tmp/zhiyi_verify_${DATE}" LOG_FILE="${HOME}/.hermes/logs/backup_verify.log" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" } log "===== 备份验证开始 =====" # 1. Clone backup 仓库 log "[1/4] 拉取备份..." if [ ! -d "${HOME}/zhiyi-backup-verify" ]; then git clone "http://192.168.123.11:3000/xiaoxue_admin/zhiyi-backup.git" "${HOME}/zhiyi-backup-verify" else cd "${HOME}/zhiyi-backup-verify" git pull origin main fi cd "${HOME}/zhiyi-backup-verify" # 找最新备份 LATEST=$(ls -t *.tar.gz 2>/dev/null | head -1) if [ -z "$LATEST" ]; then log "ERROR: 未找到任何备份文件" exit 1 fi log "验证备份: ${LATEST}" # 2. 校验 tar.gz 完整性 log "[2/4] 校验 tar.gz 完整性..." if tar -tzf "$LATEST" > /dev/null 2>&1; then log "✓ tar.gz 文件完整" else log "ERROR: tar.gz 文件损坏" exit 1 fi # 3. 解压并校验 SQLite log "[3/4] 解压并校验 SQLite..." mkdir -p "${VERIFY_DIR}" tar -xzf "$LATEST" -C "${VERIFY_DIR}" DATA_DIR=$(ls -d "${VERIFY_DIR}"/zhiyi_backup_* 2>/dev/null | head -1) if [ -z "$DATA_DIR" ]; then log "ERROR: 无法找到解压后的数据目录" exit 1 fi # 校验 graph.db if [ -f "${DATA_DIR}/memoryweave/graph.db" ]; then NODE_COUNT=$(sqlite3 "${DATA_DIR}/memoryweave/graph.db" "SELECT count(*) FROM nodes;" 2>/dev/null || echo "ERR") if [ "$NODE_COUNT" != "ERR" ]; then log "✓ 图谱数据库正常 (${NODE_COUNT} nodes)" else log "ERROR: 图谱数据库损坏" fi else log "WARN: graph.db 不存在" fi # 校验 memoryweave.db if [ -f "${DATA_DIR}/memoryweave/memoryweave.db" ]; then DB_SIZE=$(du -sh "${DATA_DIR}/memoryweave/memoryweave.db" | cut -f1) log "✓ LiteDB 数据库存在 (${DB_SIZE})" else log "WARN: memoryweave.db 不存在" fi # 校验 LanceDB 目录 if [ -d "${DATA_DIR}/memoryweave/memories.lance" ]; then LANCE_SIZE=$(du -sh "${DATA_DIR}/memoryweave/memories.lance" | cut -f1) log "✓ LanceDB 向量目录存在 (${LANCE_SIZE})" else log "WARN: memories.lance 不存在" fi # 4. 清理 log "[4/4] 清理临时文件..." rm -rf "${VERIFY_DIR}" log "===== 备份验证完成 =====" echo ""