背景 链接到标题
OpenClaw 部署在 server-a 上的实例(版本 2026.6.5),用户反馈 “Memory search 暂时不可用”。另一个实例 server-b 上相同配置却工作正常。
排查目标:找到差异,修复问题。
排查过程 链接到标题
阶段 1:对比配置差异 链接到标题
先对比两边的 memorySearch 配置:
| 实例 | provider | 状态 |
|---|---|---|
| server-b(正常) | ollama-ollama-host |
✅ |
| server-a(异常) | ollama + remote.baseUrl |
❌ |
配置都指向同一台 Ollama 服务器,模型都是 bge-m3。尝试了三种修改:
- 将 provider 改为
ollama-ollama-host→ 插件不加载(该实例无本地 Ollama) - 将 provider 改为
openai-compatible→ 插件同样不加载 - 恢复原配置 → 插件正常加载
结论:provider 名不是根本原因,ollama 插件本身加载正常。
阶段 2:分析日志 链接到标题
日志中发现了关键线索:
memory_search tool 仍然返回 disabled,重启以尝试清除工具缓存状态
多次重启后问题依旧 — 说明这不是内存缓存,而是持久化状态的问题。
进一步查看启动日志,发现 ollama 插件在某些热加载后不加载:
http server listening (2 plugins: feishu, memory-core; 10.9s)
ollama 插件从 3 个变成了 2 个。这是因为某些 provider 配置变更导致热加载时插件注册失败。
阶段 3:定位根因 链接到标题
运行 openclaw doctor 发现了真正的问题:
◇ Plugin registry ─────────────────────────────────────────╮
│ Persisted plugin registry is missing or stale. │
│ Repair with openclaw doctor --fix to rebuild │
│ ~/.openclaw/state/openclaw.sqlite from enabled plugins. │
├───────────────────────────────────────────────────────────╯
Plugin registry 过时了。OpenClaw 的插件注册表持久化在 SQLite 数据库中,与运行时的插件状态不一致,导致 memory_search 工具持续返回 disabled。
同时,state/openclaw.sqlite 中还持久化了 circuit breaker 的 cooldown 状态,即使重启也无法清除。
阶段 4:其他发现 链接到标题
- Session lock 文件残留(进程已退出但锁未释放)
- Deepseek 请求偶发被中止(
Request was aborted),但 API 本身可达(返回 401 正常) tools.alsoAllow中存在大量未启用插件的工具条目(不影响功能,但日志有 warning)
修复 链接到标题
- 恢复配置:回退到原配置
provider: "ollama"+remote.baseUrl - 清除状态:删除
state/openclaw.sqlite消除持久化的 circuit breaker 状态 - 重建注册表:运行
openclaw doctor --fix重建插件注册表(6/52 enabled plugins indexed) - 完整重启:
docker compose up -d重新创建容器
修复后:
http server listening (3 plugins: feishu, memory-core, ollama; 10.7s)
3 个插件正常加载,memory_search 恢复正常。
根因总结 链接到标题
| 问题 | 原因 |
|---|---|
| memory_search 返回 disabled | Plugin registry 过时 + circuit breaker 状态持久化 |
| 热加载后插件丢失 | 不兼容的 provider 配置导致 ollama 插件注册失败 |
| 重启无法恢复 | 状态持久化在 SQLite 中,需手动清除 |
题外话 链接到标题
本次排查全程使用 DeepSeek V4 Flash 模型辅助完成。在定位 SQLite 持久化数据问题时花费了较多时间,总消耗约 9 元。虽然总 token 量不大,但约 1/3 未命中 cache(长上下文、重复调用),导致费用偏高。
不过最终能解决问题,这笔投入是值得的。
排查建议 链接到标题
- 优先运行
openclaw doctor— 它能发现配置、插件注册表、状态完整性等常见问题 - 持久化状态需手动清除 — circuit breaker、cooldown 等状态持久化在 SQLite 中,重启不重置
- 配置热加载有风险 — 某些 provider 变更会导致插件注册失败,完整重启更可靠
- 保护路径不可通过 API 修改 — 如
agents.defaults.memorySearch.provider属于保护路径,config.patch会拒绝,需直接编辑配置文件