#!/usr/bin/env python3 # -*- coding: utf-8 -*- """backup_db.py — VPS 本地全库备份(回滚保险)。 sqlite3 .backup 在线一致 + WAL checkpoint(TRUNCATE) + integrity_check。 所有迁移单元的前置。BAK 同机存放,可立即恢复(满足"备份能回滚搞不坏")。 注:VPS(公网)↔ NAS(内网)不直连,异地冗余需 Mac 中转(28GB 大,可选)。 此处只做 VPS 本地 .bak(核心回滚保障)。 """ import sqlite3 import datetime from pathlib import Path DB = Path(r"C:\sanguo_vnpy_v2\data\quant_trading.db") ts = datetime.date.today().strftime("%Y%m%d") BAK = DB.parent / f"quant_trading.db.bak_{ts}" print(f"DB : {DB} ({DB.stat().st_size / 1024**3:.1f} GB)") print(f"BAK: {BAK}") src = sqlite3.connect(str(DB), timeout=120) src.execute("PRAGMA busy_timeout = 120000") print("WAL checkpoint(TRUNCATE)...") print(" ", src.execute("PRAGMA wal_checkpoint(TRUNCATE)").fetchone()) if BAK.exists(): print(f"BAK 已存在, 覆盖: {BAK}") print("sqlite3 .backup (在线一致, 可能需几分钟)...") with sqlite3.connect(str(BAK)) as dst: src.backup(dst) src.close() print(f"BAK 写入: {BAK.stat().st_size / 1024**3:.1f} GB") # integrity_check on backup chk = sqlite3.connect(str(BAK)) result = chk.execute("PRAGMA integrity_check").fetchone()[0] chk.close() print(f"integrity_check: {result}") print("BACKUP DONE" if result == "ok" else "BACKUP WARNING: integrity_check 非 ok")