fix: 备份/恢复脚本统一用 better-sqlite3 替代 sqlite3 CLI
容器内没有 sqlite3 CLI(Alpine 基础镜像),统一改为 docker exec node -e 调用 better-sqlite3 执行 checkpoint 和验证。
This commit is contained in:
parent
7c213873bb
commit
cb0424c896
|
|
@ -12,9 +12,10 @@ log() { echo "[$(date '+%H:%M:%S')] $1"; }
|
||||||
log "开始备份云端数据库..."
|
log "开始备份云端数据库..."
|
||||||
|
|
||||||
# 备份前执行 WAL checkpoint,确保数据全部合并到 .db 主文件
|
# 备份前执行 WAL checkpoint,确保数据全部合并到 .db 主文件
|
||||||
log "执行 WAL checkpoint..."
|
log "执行 WAL checkpoint (assets)..."
|
||||||
ssh txjp "docker exec assets-ai sqlite3 /app/data/assets.db 'PRAGMA wal_checkpoint(TRUNCATE)' && \
|
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();\""
|
||||||
docker exec issue-ai sqlite3 /app/data/issue.db 'PRAGMA wal_checkpoint(TRUNCATE)'"
|
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 && \
|
ssh txjp "mkdir -p /tmp/db-backup && \
|
||||||
|
|
|
||||||
|
|
@ -155,9 +155,9 @@ restore_cloud() {
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# 2. 验证备份文件(通过临时容器,避免依赖宿主机 sqlite3)
|
# 2. 验证备份文件(通过容器内 better-sqlite3,避免依赖宿主机或容器内 sqlite3 CLI)
|
||||||
if ! ssh txjp "docker cp ${BACKUP_PATH} ${CONTAINER}:/tmp/restore-check.db 2>/dev/null && \
|
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
|
docker exec ${CONTAINER} rm /tmp/restore-check.db"; then
|
||||||
echo "[错误] 备份文件不是有效的 SQLite 数据库"
|
echo "[错误] 备份文件不是有效的 SQLite 数据库"
|
||||||
exit 1
|
exit 1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue