From cb0424c896a02ce0dc8044e1124a4267ae8b7f3d Mon Sep 17 00:00:00 2001 From: aiyimickey <39365912+aiyimickey@users.noreply.github.com> Date: Fri, 15 May 2026 16:29:42 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E5=A4=87=E4=BB=BD/=E6=81=A2=E5=A4=8D?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E7=BB=9F=E4=B8=80=E7=94=A8=20better-sqlite3?= =?UTF-8?q?=20=E6=9B=BF=E4=BB=A3=20sqlite3=20CLI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 容器内没有 sqlite3 CLI(Alpine 基础镜像),统一改为 docker exec node -e 调用 better-sqlite3 执行 checkpoint 和验证。 --- backup-db.sh | 7 ++++--- restore-db.sh | 4 ++-- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/backup-db.sh b/backup-db.sh index 4deea41..5770c2e 100755 --- a/backup-db.sh +++ b/backup-db.sh @@ -12,9 +12,10 @@ 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)'" +log "执行 WAL checkpoint (assets)..." +ssh txjp "docker exec assets-ai node -e \"const D=require('better-sqlite3');const db=new D('/app/data/assets.db');db.pragma('wal_checkpoint(TRUNCATE)');db.close();\"" +log "执行 WAL checkpoint (issue)..." +ssh txjp "docker exec issue-ai node -e \"const D=require('better-sqlite3');const db=new D('/app/data/issue.db');db.pragma('wal_checkpoint(TRUNCATE)');db.close();\"" # 云端打包 ssh txjp "mkdir -p /tmp/db-backup && \ diff --git a/restore-db.sh b/restore-db.sh index ae8e55b..8f28c3b 100755 --- a/restore-db.sh +++ b/restore-db.sh @@ -155,9 +155,9 @@ restore_cloud() { exit 1 fi - # 2. 验证备份文件(通过临时容器,避免依赖宿主机 sqlite3) + # 2. 验证备份文件(通过容器内 better-sqlite3,避免依赖宿主机或容器内 sqlite3 CLI) if ! ssh txjp "docker cp ${BACKUP_PATH} ${CONTAINER}:/tmp/restore-check.db 2>/dev/null && \ - docker exec ${CONTAINER} sqlite3 /tmp/restore-check.db 'SELECT count(*) FROM sqlite_master' > /dev/null 2>&1 && \ + docker exec ${CONTAINER} node -e \"const D=require('better-sqlite3');const db=new D('/tmp/restore-check.db',{readonly:true});console.log(db.prepare('SELECT count(*) as c FROM sqlite_master').get().c);db.close();\" > /dev/null 2>&1 && \ docker exec ${CONTAINER} rm /tmp/restore-check.db"; then echo "[错误] 备份文件不是有效的 SQLite 数据库" exit 1