在一次 Rocket.Chat + MongoDB 的 Docker 升级过程中,遇到 MongoDB 无法启动并自动退出的问题。最终确认,是因为 未设置 setFeatureCompatibilityVersion(FCV)导致的启动失败。这篇文章将完整记录问题日志、错误分析与解决过程,希望为大家避坑提供参考。


🧩 问题现象

在使用 Docker 启动 MongoDB 7.0 时,容器没有正常运行,而是立即触发了 shutdown 流程。日志如下:

jsonCopyEdit{"msg":"Shutting down the IndexBuildsCoordinator"}
{"msg":"Shutting down the storage engine"}
{"msg":"WiredTiger closed"}
{"msg":"Now exiting"}
{"msg":"Shutting down","attr":{"exitCode":62}}

最后一行:

jsonCopyEdit"exitCode":62

❓ Exit Code 62 是什么?

exitCode: 62 在 MongoDB 中表示:

EX_UNCAUGHT (62)
MongoDB 初始化过程中发生了未捕获异常(uncaught exception),导致服务终止。

通常这意味着配置或数据存在兼容性问题。


🔍 问题原因:未设置 FCV(setFeatureCompatibilityVersion)

经过检查,发现是 在升级 MongoDB 到 7.0 后,未设置 featureCompatibilityVersion(FCV) 导致系统拒绝启动。

在升级 MongoDB 时,必须手动设置版本兼容性,否则系统会因版本不匹配而崩溃退出。

✅ 解决方案

只需在 MongoDB 运行时手动执行以下命令即可:

javascriptCopyEditdb.adminCommand({
  setFeatureCompatibilityVersion: "7.0",
  confirm: true
})

执行成功后,MongoDB 将正式启用 7.0 所需的内部结构,并能正常启动。


🛠 排查路径小结

步骤内容
✅ 查看日志发现启动过程中直接触发 shutdown
✅ 检查挂载与权限无问题,读写正常
✅ 检查 .lock 文件无残留
✅ 怀疑 WiredTiger 数据损坏否定,repair 无效
✅ 最终定位缺少 FCV 设置,MongoDB 拒绝以不确定状态启动

📘 为什么需要手动设置 FCV?

MongoDB 的 featureCompatibilityVersion 控制数据库的行为与内部结构,确保新版本启动不会破坏旧数据结构。如果没有设置,系统处于“不确定版本状态”,MongoDB 会为避免数据损坏而终止运行。

这是 MongoDB 的版本安全保护机制,尤其在涉及副本集或分片集群时,设置 FCV 是强制要求


✍ 结语

这次问题表面上是 Exit Code 62 的常规错误,但实质上是一次升级流程未执行关键步骤的问题。如果你也在使用 Docker 升级 MongoDB,务必记得:

升级版本后,执行 setFeatureCompatibilityVersion

避免莫名其妙的启动失败,节省大量排查时间。

Leave a Reply

Your email address will not be published. Required fields are marked *