Files
aiops/scripts/sqlite-maintenance.sh
T
Logan.Li fd60361d93 chore: 统一本地服务器与远程仓库源码
- 合并 main 与 master 历史并以服务器结构为基线
- 保留迁移、数据保留、AWS 账单与部署安全能力
- 建立 SDD 规格和 CI 验证闭环
2026-08-05 20:03:25 +08:00

57 lines
1.7 KiB
Bash
Executable File

#!/usr/bin/env bash
# SQLite 维护窗口工具:先可恢复备份,再 checkpoint、VACUUM 与完整性校验。 # Logan.Li
set -euo pipefail
db_path=""
backup_dir=""
pid_file=""
maintenance_window="false"
usage() {
echo "用法: $0 --maintenance-window --db /absolute/sqlite3.db --backup-dir /absolute/backups [--pid-file /absolute/.aiops.pid]" >&2
}
while [[ $# -gt 0 ]]; do
case "$1" in
--maintenance-window) maintenance_window="true"; shift ;;
--db) db_path="$2"; shift 2 ;;
--backup-dir) backup_dir="$2"; shift 2 ;;
--pid-file) pid_file="$2"; shift 2 ;;
*) usage; exit 2 ;;
esac
done
if [[ "$maintenance_window" != "true" || "$db_path" != /* || "$backup_dir" != /* || "$db_path" == "/" || "$backup_dir" == "/" ]]; then
usage
exit 2
fi
if [[ ! -f "$db_path" ]]; then
echo "数据库文件不存在: $db_path" >&2
exit 2
fi
if ! command -v sqlite3 >/dev/null; then
echo "未找到 sqlite3 命令" >&2
exit 2
fi
if [[ -n "$pid_file" && -f "$pid_file" ]]; then
service_pid=$(tr -d '[:space:]' < "$pid_file")
if [[ -n "$service_pid" && -d "/proc/$service_pid" ]]; then
echo "应用仍在运行(PID $service_pid),请先停止写入后重试" >&2
exit 3
fi
fi
timestamp=$(date +%Y%m%d%H%M%S)
backup_path="$backup_dir/aiops-sqlite-$timestamp.db"
mkdir -p "$backup_dir"
echo "开始可恢复备份: $backup_path"
sqlite3 "$db_path" ".backup '$backup_path'"
sqlite3 "$backup_path" "PRAGMA integrity_check;" | grep -qx "ok"
echo "执行 WAL checkpoint 与 VACUUM"
sqlite3 "$db_path" "PRAGMA wal_checkpoint(TRUNCATE); VACUUM; PRAGMA integrity_check;" | tail -1 | grep -qx "ok"
echo "维护完成"
du -h "$db_path" "$backup_path"