要解决的问题

SQLite 数据可能涉及 WAL 等伴随文件。对于运行中的数据库,直接复制某一个文件不能被简单视为一致性备份。可以通过数据库连接提供的备份接口生成另一个数据库,再实际读取备份检查样本数据。

适用环境

Python 3.12 的 sqlite3 标准库;示例仅创建并清理自己的临时目录,不连接本站生产数据库。

操作步骤与示例

先运行下面的小样本,再把输入替换为自己的资料;保留原始文件副本。

import sqlite3
import tempfile
from pathlib import Path
from contextlib import closing
with tempfile.TemporaryDirectory() as folder:
    source_path = Path(folder) / "source.sqlite3"
    copy_path = Path(folder) / "copy.sqlite3"
    with closing(sqlite3.connect(source_path)) as source:
        source.execute("CREATE TABLE notes(id INTEGER PRIMARY KEY, title TEXT)")
        source.execute("INSERT INTO notes VALUES(1,?)", ("备份样本",))
        source.commit()
        with closing(sqlite3.connect(copy_path)) as destination:
            source.backup(destination)
    with closing(sqlite3.connect(copy_path)) as check:
        assert check.execute("PRAGMA quick_check").fetchone()[0] == "ok"
        assert check.execute("SELECT title FROM notes WHERE id=1").fetchone()[0] == "备份样本"
    print("备份结构和样本记录核对通过")

如何判断结果

运行应报告结构和样本记录通过。示例把备份写入不同路径,并关闭连接后重新打开备份,避免只检查内存中的对象。实际应用还需要核对关键记录、权限与恢复流程。

常见问题与排查

备份命令运行成功,不表示备份一定覆盖预期业务时间点,也不代表文件已经异地保存。不要把输出路径设为正在使用的源库;遇到锁、磁盘空间或权限问题时先确认原因。

适用边界

本例不是本站生产恢复操作。真正恢复前应停写并按应用流程处理数据库及伴随文件,保留原件和失败现场。结构检查不能代替完整的业务恢复演练。

参考资料