DANGER
本页由 AI 工具参考代码编写,尚未经过人工审核,内容仅供参考。如果无法解决问题或需要协助部署,可邮箱联系:kuohu@getastra.cn
数据库维护
本章介绍 SQLite 与 MySQL 的日常维护事项,帮助保持数据库稳定、可恢复。
SQLite
文件与备份
- 数据库是单个文件,路径由
config.toml的db.path指定(模板默认./data/astra_schedule.db) - 备份 = 复制文件。建议先停止服务或使用文件快照,避免复制到写入中的文件(见备份策略)
日志模式:拒绝 WAL
本项目不使用 SQLite 的 WAL(Write-Ahead Logging)模式,服务启动时会检查库头:
- 检测到 WAL 库时自动转回默认的 rollback journal 模式(
PRAGMA journal_mode=DELETE),转换失败才拒绝启动并打印离线转换命令 - WAL 依赖的
-shm共享内存不会跨 NFS 客户端共享,多个服务(如 usr-backend 与 sys-backend)经 NFS 打开同一库时会报database disk image is malformed甚至损坏数据;本项目读多写少,WAL 的并发写收益也用不上 - 如需手工转换:停掉所有后端后执行
sqlite3 <db文件> "PRAGMA journal_mode=DELETE;"
因此备份时直接 cp 数据库文件即可,无需关心 -wal/-shm 附属文件(正常运行的库根本不会产生它们)。
文件增长与压缩
SQLite 删除数据后文件大小不会自动缩小。若发现数据库文件异常膨胀(长期频繁写入后),可执行压缩:
VACUUM 会重写整个数据库文件,执行前务必先备份。一般学校场景数据量小,无需定期压缩。
完整性检查
返回 ok 表示数据库完好。
MySQL
- 依赖数据库自身的自动备份(如 RDS 自动备份,见备份策略)
- 日常维护(慢查询、容量、索引)可在 MySQL 控制台查看
- 不建议在运行中手动改动表结构,表结构变更由后端启动时的 AutoMigrate 完成
备份有效性验证
备份只有在能恢复时才有价值。建议每学期至少做一次「备份演练」:
- 导出一份当前 JSON 备份
- 在测试环境(或临时目录部署一个后端)导入该备份
- 确认各班级课表、作息、设置、自动任务完整
演练中发现的问题(如备份文件损坏)应尽早处理,避免真正需要恢复时才发现。
磁盘空间
- 日志文件(journald、Nginx)可能持续增长,建议定期清理或配置日志轮转
- 保留至少 1GB 可用空间,避免数据库写入失败
