#!/bin/bash # 云端数据库一键备份脚本 # 用法:bash backup-db.sh set -e TIMESTAMP=$(date +%Y%m%d_%H%M%S) LOCAL_DIR="/Users/niuniu/programs/docker/db-backups" log() { echo "[$(date '+%H:%M:%S')] $1"; } log "开始备份云端数据库..." # 备份前执行 WAL checkpoint,确保数据全部合并到 .db 主文件 log "执行 WAL checkpoint..." ssh txjp "docker exec assets-ai sqlite3 /app/data/assets.db 'PRAGMA wal_checkpoint(TRUNCATE)' && \ docker exec issue-ai sqlite3 /app/data/issue.db 'PRAGMA wal_checkpoint(TRUNCATE)'" # 云端打包 ssh txjp "mkdir -p /tmp/db-backup && \ cp /root/docker/assets-ai/data/assets.db /tmp/db-backup/assets-${TIMESTAMP}.db && \ cp /root/docker/issue-ai/data/issue.db /tmp/db-backup/issue-${TIMESTAMP}.db" # 确保本地备份目录存在 mkdir -p "${LOCAL_DIR}" # 复制到本地 log "复制到本地..." scp "txjp:/tmp/db-backup/assets-${TIMESTAMP}.db" "${LOCAL_DIR}/" scp "txjp:/tmp/db-backup/issue-${TIMESTAMP}.db" "${LOCAL_DIR}/" # 验证备份文件为有效 SQLite 数据库 log "验证备份完整性..." for f in "${LOCAL_DIR}/assets-${TIMESTAMP}.db" "${LOCAL_DIR}/issue-${TIMESTAMP}.db"; do if ! sqlite3 "$f" "SELECT count(*) FROM sqlite_master" > /dev/null 2>&1; then echo "[错误] 备份文件无效或损坏: $f" exit 1 fi done log "备份文件验证通过" # 清理云端临时文件 ssh txjp "rm -rf /tmp/db-backup" log "备份完成:${TIMESTAMP}" ls -lh "${LOCAL_DIR}"/assets-${TIMESTAMP}.db "${LOCAL_DIR}"/issue-${TIMESTAMP}.db 2>/dev/null