给 SQLite 做备份时,先看一眼 WAL
备份之前,先看连接配置
本站在 SQLite 建立连接时启用 journal_mode=WAL,同时开启外键检查。这样一来,运行目录中可能出现数据库主文件之外的 WAL 文件。
这也提醒我:备份不能只凭文件名看起来像数据库,就把它当成某个时刻的完整快照。
让数据库连接生成备份
项目的备份脚本通过 Python 的 SQLite 连接调用 backup,生成一个单独的目标数据库,再把它和媒体目录一起打包。核心过程是:
import sqlite3
source = sqlite3.connect('/data/site.db')
target = sqlite3.connect('/data/site-backup.db')
try:
source.backup(target)
finally:
target.close()
source.close()
源库和目标库使用不同路径。脚本生成临时备份后,再由归档步骤保存这份副本。
内容备份和完整备份用途不同
内容导出 JSON 方便检查作品、笔记和站点配置;数据库备份用于保留数据库状态;媒体还需要单独归档。它们能解决的问题不完全一样。
最后还要考虑恢复
备份文件存在,只是第一步。恢复时应先放到独立目录,确认文件能打开、记录能读取,再决定是否替换正在使用的数据。不要把第一次恢复尝试直接放在正在服务的网站上。