# 任务:OpenCode SQLite 数据库诊断与优化
你是一名精通 SQLite 与 OpenCode 内部存储机制的数据库专家。请对 OpenCode 的本地数据库进行系统性诊断和优化。**全程只读优先:所有可能修改数据的操作必须先展示计划、经我确认后再执行,并提前备份。**
## 背景知识
- OpenCode 数据目录:`~/.local/share/opencode/`(Windows 下为 `%USERPROFILE%\.local\share\opencode\`)
- 核心库为 SQLite,可通过 `opencode db path` 获取准确路径,可用 `opencode db "SQL"` 直接执行查询(支持 `--format json|tsv`)
- 环境变量 `OPENCODE_DISABLE_PRUNE` 会关闭旧数据自动清理;默认开启自动 prune
## 第一步:诊断(只读)
1. 用 `opencode db path` 定位数据库文件,同时列出同目录相关文件(`*.db`、`*.db-wal`、`*.db-shm`、快照/snapshots 目录),记录各自大小。
2. 检查数据库运行状态(是否存在 WAL/SHM 残留、是否有其他进程占用)。
3. 运行完整性检查,逐项输出结果:
- `PRAGMA integrity_check;`
- `PRAGMA foreign_key_check;`
- `PRAGMA journal_mode;`
- `PRAGMA wal_checkpoint(PASSIVE);`(仅报告状态,不强制清理)
4. 统计表结构与数据量,列出所有表名、行数、占用空间估算,并重点分析会话表与消息表(通常为 `session`、`part` 等):
- 各表行数、总字节数
- `sqlite_sequence` / 自增键情况
- 缺少索引或索引冗余的情况(用 `EXPLAIN QUERY PLAN` 抽查高频查询路径)
- 是否存在大量 `deleted`/孤儿数据、重复条目或超大 blob(如快照、附件)
## 第二步:诊断结论与优化方案(先呈现,经确认再执行)
针对诊断结果给出分级建议并注明影响,例如:
1. **低风险常规维护**:`VACUUM`(回收碎片)、重建或补建缺失索引、清理孤儿/过期会话记录。
2. **数据清理**:按时间或体积删除/导出旧会话前,先用 `opencode export <sessionID> --sanitize` 备份关键数据。
3. **WAL 处理**:若 WAL 异常膨胀,先确保无活动连接,再做 checkpoint 并评估是否切换 journal_mode。
4. **结构性优化**:若某表长期膨胀,评估归档到独立文件、拆表或分库的可行性。
## 第三步:执行(仅在确认后)
- 执行前创建备份:复制 `*.db`、`*-wal`、`*-shm` 到带时间戳的备份目录(如 `opencode-db-backup-YYYYMMDD-HHMMSS`),并验证备份文件可打开、完整性通过。
- 逐项执行优化命令,每步操作前后记录数据库体积与完整性校验结果。
- 严禁:不备份直接 `VACUUM`/`DELETE`/`DROP`;在 opencode 进程运行中强制删库;跳过 `integrity_check`。
## 第四步:验证与报告
- 优化完成后重新运行 `PRAGMA integrity_check;` 与 `PRAGMA foreign_key_check;`,确认通过。
- 对比优化前后的文件大小、碎片率、常用查询耗时,给出量化收益。
- 输出最终报告:发现的问题、已执行的命令、每步影响、剩余建议(含是否建议定期维护、是否需设置 `OPENCODE_DISABLE_PRUNE`)。
## 边界与禁忌
- 只优化数据层,不修改 opencode 二进制或源码。
- 不删除仍被引用的会话数据;所有删除前先确认无业务价值。
- 遇到任何不确定之处,先停下向我提问,不要擅自决定。提示词:OpenCode SQLite 数据库诊断与优化
https://kaneniu.com/archives/1786116647219.html
评论