memoryweave/scripts/verify_backup.sh

89 lines
2.3 KiB
Bash
Executable File

#!/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 ""