xiaowei-system/scripts/snapshot-state-db.sh

42 lines
1.6 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# snapshot-state-db.sh — state.db 定时健康快照2026-09-03
# 用 sqlite3 .backup在线一致性快照gateway 运行时安全),不是 cp
# 保留最近 8 份;损坏恢复时用最近的快照(比 19:26 那份手工备份新得多)
set -uo pipefail
DB=/home/muc/.hermes/state.db
SNAP_DIR=/home/muc/.hermes/backups/state-db-snap
KEEP=8
TS=$(date +%Y%m%d-%H%M)
LOG=/tmp/state-db-snap.log
mkdir -p "$SNAP_DIR"
# 1. 在线一致性快照
if ! sqlite3 "$DB" ".backup '$SNAP_DIR/state-$TS.db'" 2>>"$LOG"; then
echo "[$(date '+%H:%M:%S')] ❌ state.db 快照失败" | tee -a "$LOG"
exit 1
fi
# 2. 验证快照健康
CHECK=$(sqlite3 "$SNAP_DIR/state-$TS.db" "PRAGMA integrity_check;" 2>&1 | head -1)
if [ "$CHECK" != "ok" ]; then
echo "[$(date '+%H:%M:%S')] ⚠️ 快照 integrity=$CHECK(删除坏快照)" | tee -a "$LOG"
rm -f "$SNAP_DIR/state-$TS.db"
exit 1
fi
# 2.5 快照切 WAL 模式2026-09-06 模式15.backup 产物默认 delete 头,直接拿去恢复会触发
# gateway 启动 delete→WAL 转换风暴 → FTS5 撕裂;让快照生而 WAL恢复链全程无转换
JM=$(sqlite3 "$SNAP_DIR/state-$TS.db" "PRAGMA journal_mode=WAL;" 2>&1)
if [ "$JM" != "wal" ]; then
echo "[$(date '+%H:%M:%S')] ⚠️ 快照切 WAL 失败 ($JM),删除该快照" | tee -a "$LOG"
rm -f "$SNAP_DIR/state-$TS.db"
exit 1
fi
# 3. 清理旧快照(保留最近 KEEP 份)
ls -1t "$SNAP_DIR"/state-*.db 2>/dev/null | tail -n +$((KEEP+1)) | xargs -r rm -f
echo "[$(date '+%H:%M:%S')] ✅ 快照 state-$TS.db (integrity=ok, 保留 $(ls "$SNAP_DIR"/state-*.db 2>/dev/null | wc -l) 份)" >> "$LOG"