56 lines
1.9 KiB
Bash
Executable File
56 lines
1.9 KiB
Bash
Executable File
#!/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)"
|