背景 链接到标题

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。尝试了三种修改:

  1. 将 provider 改为 ollama-ollama-host → 插件不加载(该实例无本地 Ollama)
  2. 将 provider 改为 openai-compatible → 插件同样不加载
  3. 恢复原配置 → 插件正常加载

结论: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)

修复 链接到标题

  1. 恢复配置:回退到原配置 provider: "ollama" + remote.baseUrl
  2. 清除状态:删除 state/openclaw.sqlite 消除持久化的 circuit breaker 状态
  3. 重建注册表:运行 openclaw doctor --fix 重建插件注册表(6/52 enabled plugins indexed)
  4. 完整重启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(长上下文、重复调用),导致费用偏高。

不过最终能解决问题,这笔投入是值得的。

排查建议 链接到标题

  1. 优先运行 openclaw doctor — 它能发现配置、插件注册表、状态完整性等常见问题
  2. 持久化状态需手动清除 — circuit breaker、cooldown 等状态持久化在 SQLite 中,重启不重置
  3. 配置热加载有风险 — 某些 provider 变更会导致插件注册失败,完整重启更可靠
  4. 保护路径不可通过 API 修改 — 如 agents.defaults.memorySearch.provider 属于保护路径,config.patch 会拒绝,需直接编辑配置文件