升级失败三次后,我决定不升了:一次真实的复盘

72 阅读6分钟

排障实录 01:OpenClaw 升级失败三次,我是怎么把系统救回来的

2026-10-20 | 真实故障复盘 | 附完整命令


速查表(出事了直接看这段)

症状 → 原因 → 解法

你看到的真实原因怎么解
status: skipped + handoff更新入口把活儿交给一个已过期的一次性任务查那个任务的 StartBoundary,今天还触发吗
脚本跑到一半断了,npm install 没执行脚本跑在网关进程树里,杀网关=杀自己改用计划任务或独立服务跑
npm 退出码: 0 但版本号没变postinstall 被 npm 默认跳过看 install-scripts 警告;加 --allow-scripts
升级后网关起不来,cannot import .../infra-runtime插件版本不兼容内核查插件有没有对应版本,没有就放弃升级
回滚代码后旧版本拒绝启动数据库 schema 被升过(v19→v20、v24→v25)把 agent 库和 state 库一起还原
回滚完网关又被杀一次残留的升级计划任务被重跑schtasks /delete 删掉它

一页命令(复制即用)

# ── 升级前 ──
openclaw --version                          # 记下当前版本
copy openclaw.json openclaw.json.bak-<日期> # 备份配置

# ── 执行升级(脱离网关进程树)──
schtasks /create /tn "X" /tr "powershell -File <脚本>" /sc once /st 23:59 /f
schtasks /run /tn "X"

# ── 验证真装上了没 ──
npm ls -g openclaw --depth=0                # 只信这个,不信退出码

# ── 回滚 ──
copy backup\openclaw-agent.sqlite agents\<agent>\agent\ -Force   # 每个 agent 库
copy backup\openclaw.sqlite state\ -Force                        # state 库
schtasks /delete /tn "X" /f                                      # 删残留任务

# ── 体检 ──
openclaw --version
openclaw status --deep
# 日志里搜 integrity_check(必须全绿)和 plugin(不能有 import 失败)

一句话结论

升级失败不是最可怕的,最可怕的是"看起来成功了"。

我遇到的是 npm install 退出码 0、日志显示 added 7 packages, changed 409 packages,但版本号从头到尾没变。


一、故障现象

想把 OpenClaw 从 2026.9.33 升到 2026.10.5。

第一次用官方更新入口:

gateway update.run

返回:

{
  "status": "skipped",
  "reason": "managed-service-handoff-started",
  "handoff": { "command": "openclaw update --yes --channel extended-stable" }
}

看起来交出去了,实际上没有执行。

等了 20 分钟,检查版本:

openclaw --version
# OpenClaw 2026.9.33 (5873f81)   ← 一动不动

二、第一个根因:一次性计划任务早就过期了

查计划任务:

Get-ScheduledTask | Where-Object { $_.TaskName -like "*OpenClaw*" }

结果里有个 openclaw-upgrade-933,查它的触发器:

(Get-ScheduledTask -TaskName "openclaw-upgrade-933").Triggers
StartBoundary : 2026-10-15T22:28:35+08:00

这是一次性任务,设定在 4 天前,今天根本不会再触发。

更新入口把活儿交给一个已经死了的任务,然后自己报 skipped 退出。

教训:遇到 skipped + handoff,先去看它交接给了谁,那个东西还活着吗。


三、第二个坑:把网关杀了,脚本也死了

改成自己写独立 PowerShell 脚本:

# 停任务 → 杀进程 → npm install → 重启任务

结果脚本跑到 已杀进程: 46480 就断了,npm install 从未执行。

原因:这个脚本是我通过网关的 exec 工具启动的,它是网关的子进程。杀掉网关 = 杀死自己的父进程,整棵进程树一起没了。

教训:任何需要重启网关的操作,绝不能让脚本挂在网关的进程树下面。


四、第三个坑:npm 的"假成功"

改成通过 Windows 计划任务跑(计划任务的父进程是系统服务,不会跟着网关死):

schtasks /create /tn "OpenClawUpgrade105" `
  /tr "powershell.exe -NoProfile -ExecutionPolicy Bypass -File <脚本>" `
  /sc once /st 23:59 /f
schtasks /run /tn "OpenClawUpgrade105"

这次 npm install 真的跑了,日志显示:

added 7 packages, removed 16 packages, and changed 409 packages in 2m
npm 退出码: 0

退码 0,看起来成功了。

但检查:

npm ls -g openclaw --depth=0
# `-- openclaw@2026.9.33     ← 还是旧版

翻 npm 完整输出,找到了原因:

npm warn install-scripts 5 packages have install scripts not yet covered by allowScripts:
  esbuild@0.28.2 (postinstall: node install.js)
  koffi@3.3.2 (install: node ./cnoke.cjs -P . -D src/koffi --prebuild --release)
  openclaw@2026.10.5 (postinstall: node scripts/postinstall-bundled-plugins.mjs)

npm 较新版本默认不执行 postinstall 脚本。 而 openclaw 的 postinstall-bundled-plugins.mjs 正是安装内置插件的关键步骤。

没有执行 postinstall = 装了个空壳。


五、但是——真正的拦截不是这个

加 --allow-scripts 重装,这次真的升到了 2026.10.5。

然后网关起不来。日志里:

Plugin openclaw-weixin cannot import openclaw/plugin-sdk/infra-runtime
(built with OpenClaw unknown; running core 2026.10.5)

查微信插件版本:

npm view @tencent-weixin/openclaw-weixin version
# 2.4.x

结论:微信插件 2.4.x 不兼容 10.5 内核,而 npm 上根本没有对应 10.5 的版本。

这不是配置问题,是上游没发版。再怎么折腾也没用。


六、回滚:三个必须检查的地方

升级失败后回滚,我踩了两个坑:

坑 1:数据库 schema 版本

10.5 启动时会自动迁移数据库:

  • state 库:v19 → v20
  • agent 库:v24 → v25

回滚代码后,旧版本会因为 schema 版本过高而拒绝启动。

解决:把 10 个数据库全部还原到升级前的备份。

# 9 个 agent 库 + 1 个 state 库,逐个还原
Copy-Item "backup\openclaw-agent.sqlite" "agents\main\agent\" -Force
Copy-Item "backup\openclaw.sqlite" "state\" -Force

坑 2:残留的计划任务

我创建的那个 OpenClawUpgrade105 任务还留着,随时可能被再次触发,把健康的网关再打断一次。

schtasks /delete /tn "OpenClawUpgrade105" /f

坑 3:配置漂移

失败的升级过程改了配置。回滚后要逐项核对:

  • 模型清单
  • 插件列表
  • 通道配置

七、最终的体检清单(回滚后必做)

# 1. 版本
openclaw --version

# 2. 网关可达
openclaw status --deep

# 3. 数据库完整性(关键)
#     日志里搜 integrity_check,必须全部通过

# 4. 插件加载
#     日志里搜 plugin,确认没有 import 失败的

# 5. 通道
openclaw status  # 看 Channels 表格

我的实测结果:

版本:     2026.9.33
网关:     22ms 可达
数据库:   10 个 sqlite,integrity_check 74 张表全部 healthy
插件:     21 个加载成功
微信通道: OK

八、四条可以抄走的经验

  1. skipped 不等于"交给别人了",等于"你需要去查那个别人是谁"。
  2. 重启网关的操作,不能跑在网关的进程树里。 用计划任务或独立服务。
  3. npm 退码 0 不等于装成功。 查 install-scripts 警告,查版本号本身。
  4. 回滚不是"把代码切回去"就完事。 数据库 schema、残留任务、配置漂移,三样都要查。

九、一句话总结

升级系统最大的风险不是升级本身,是"你以为升成功了,但实际上留下了一个半新半旧的状态"。

我现在这套系统跑的是 9.33(LTS 通道),数据库完整,通道正常。在微信插件支持 10.5 之前,不升。


所有命令和日志都是真实的,可复现。