feat: 实现 SQLite 迁移备份、完整表结构与简单写入队列
This commit is contained in:
@@ -73,6 +73,30 @@
|
||||
- 备选方案:协议包只做编解码,校验留给各 app 模块。
|
||||
- 影响:服务端应复用本包 `Validate`,避免重复规则。
|
||||
|
||||
### T0.3 2026-09-30
|
||||
|
||||
1. **完整表放在 0002,不改已发布的 0001**
|
||||
- 原条款:TASKS T0.3 / 4.2「`0001_init.sql` 包含第 7.7 节全部表」;T0.1 偏差曾写「T0.3 需替换 0001 正文」。
|
||||
- 实际做法:保留 `0001_init.sql` 为 `SELECT 1;`;新增 `0002_schema.sql` 写入 DEVELOPMENT 7.7 全部业务表与索引(含 `api_tokens`、`settings`、`session_hash` 等)。`schema_migrations` 仍由迁移执行器 `CREATE TABLE IF NOT EXISTS` 维护,不放入 0002。
|
||||
- 原因:T0.1 的 0001 可能已记入已有库的 `schema_migrations`;改写已发布迁移语义会导致「版本已应用但表不存在」。
|
||||
- 备选方案:对未迁移库特殊检测并改写 0001(复杂且易错)。
|
||||
- 影响:新库会有版本 1+2 两行;与 TASKS「表在 0001」字面不一致,与「不改已发布迁移」一致。
|
||||
|
||||
2. **写入队列先做一操作一事务**
|
||||
- 原条款:DEVELOPMENT 7.2 合并提交(最多 256 或凑满 2ms,SAVEPOINT);TASKS T0.3 允许简单实现,P2 换合并。
|
||||
- 实际做法:`store.Queue` 用互斥锁串行,每请求一个事务;注释与本条标明 P2 再改为写 goroutine 合并提交。
|
||||
- 原因:本任务范围;合并留给平台 P2。
|
||||
- 备选方案:T0.3 直接做合并(抢 P2 范围)。
|
||||
- 影响:高并发写入落盘次数偏多,正式压测前需完成 P2。
|
||||
|
||||
3. **空库不备份;仅已有 db 文件且有未应用版本时 VACUUM INTO**
|
||||
- 原条款:DEVELOPMENT 7.7「有未应用版本时先 VACUUM INTO」;未区分空库。
|
||||
- 实际做法:`Open` 在打开前检查 `nixmsg.db` 是否已存在;不存在则跳过备份;存在且有 pending 则写入 `<data_dir>/backup/pre-migrate-<UTC时间>.db`。迁移失败返回错误,不自动从备份恢复。
|
||||
- 原因:空库备份无意义;失败退出与文档一致,恢复交给运维。
|
||||
- 备选方案:失败时自动还原备份再退出。
|
||||
- 影响:与任务说明一致;运维需知备份路径。
|
||||
|
||||
|
||||
## 平台 P
|
||||
|
||||
暂无。
|
||||
|
||||
Reference in New Issue
Block a user