42 lines
1.6 KiB
Bash
Executable File
42 lines
1.6 KiB
Bash
Executable File
#!/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"
|