#!/bin/bash # ============================================================================ # 向量记忆增量备份脚本 # 策略:每日一个快照,通过 rsync --link-dest 指向前一天快照 # 文件内容未变时使用硬链接(不占额外空间) # 保留最近 14 个每日快照 # ============================================================================ set -e SOURCE="$HOME/.openclaw/memory/main.sqlite" BACKUP_DIR="$HOME/openclaw-backup/vector_memory/snapshots" TODAY=$(date +%Y%m%d) YESTERDAY=$(date -d "yesterday" +%Y%m%d) SNAPSHOT_TODAY="$BACKUP_DIR/$TODAY" SNAPSHOT_YESTERDAY="$BACKUP_DIR/$YESTERDAY" mkdir -p "$BACKUP_DIR" log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] [vector_backup] $1" } # ---- 检查源文件 ---- if [ ! -f "$SOURCE" ]; then log "ERROR: 源文件不存在 $SOURCE" exit 1 fi # ---- 执行增量/全量备份 ---- if [ -n "$SNAPSHOT_YESTERDAY" ] && [ -d "$SNAPSHOT_YESTERDAY" ]; then # 有昨天快照:增量硬链接 mkdir -p "$SNAPSHOT_TODAY" rsync -a --link-dest="$SNAPSHOT_YESTERDAY" "$SOURCE" "$SNAPSHOT_TODAY/main.sqlite" log "增量备份完成 → $SNAPSHOT_TODAY/main.sqlite ($(du -h "$SNAPSHOT_TODAY/main.sqlite" | cut -f1))" else # 无昨天快照(首次或跨天后首次):全量 mkdir -p "$SNAPSHOT_TODAY" cp "$SOURCE" "$SNAPSHOT_TODAY/main.sqlite" log "全量备份完成 → $SNAPSHOT_TODAY/main.sqlite ($(du -h "$SNAPSHOT_TODAY/main.sqlite" | cut -f1))" fi # ---- 清理 14 天前的快照 ---- SNAP_COUNT=$(ls -d "$BACKUP_DIR"/20* 2>/dev/null | wc -l) if [ "$SNAP_COUNT" -gt 14 ]; then ls -dt "$BACKUP_DIR"/20* | tail -n +15 | xargs -r rm -rf log "已清理 14 天前的旧快照" fi # ---- 打印当前快照列表 ---- log "当前每日快照(共 $SNAP_COUNT 个):" for d in $(ls -dt "$BACKUP_DIR"/20* 2>/dev/null); do log " $(basename $d) ($(du -sh "$d" | cut -f1))" done log "总磁盘占用: $(du -sh "$BACKUP_DIR" | cut -f1)"