意外升级MongoDB版本后,如何升级旧Mongo数据库?
解决MongoDB意外升级后的启动与版本过渡问题
这种因意外升级导致的“启动不了又无法降级/升级”的死锁情况确实让人头疼,结合你的ArchLinux环境,我整理了以下可行的解决步骤:
1. 先搞定WiredTiger版本兼容问题
你遇到的unsupported WiredTiger file version错误,核心原因是MongoDB每个版本都绑定了特定的WiredTiger版本:MongoDB 3.4.x系列对应的是WiredTiger 2.9.3的初始稳定版,而你现在升级后的WiredTiger是2.9.3.20171205-2,这个版本是适配MongoDB 3.6+的,所以旧版MongoDB无法识别新的WiredTiger文件格式。
解决方法:
- 找到适配MongoDB 3.4.9的WiredTiger版本:你可以通过Arch Linux的包仓库历史获取对应版本的源码或二进制包。比如用
pkgctl repo clone wiredtiger克隆WiredTiger的Arch包仓库,然后切换到MongoDB 3.4.9发布时对应的commit(可以通过Arch Package Database的历史记录查找时间点),编译安装该版本。 - 同时要把
wiredtiger加入/etc/pacman.conf的IgnorePkg列表,防止再次被升级。
2. 同步降级boost-libs到对应版本
MongoDB对boost库的版本依赖也很严格,3.4.x需要特定版本的boost(比如boost 1.66.x,具体可以查看MongoDB 3.4.9的官方编译文档)。你需要:
- 同样从Arch Linux Archive获取对应版本的boost-libs包,或者编译源码安装。
- 将
boost-libs也加入IgnorePkg,确保依赖环境稳定。
3. 启动旧版MongoDB并设置featureCompatibilityVersion
当MongoDB 3.4.9的依赖(WiredTiger、boost-libs)都匹配后,尝试启动mongod:
mongod --config /etc/mongodb.conf
如果能正常启动,立即连接MongoDB CLI执行:
db.adminCommand({setFeatureCompatibilityVersion: "3.4"})
这个命令是关键,它会将数据库标记为兼容3.4版本,为后续升级到3.6.x做准备。
4. 按官方流程升级到MongoDB 3.6.1
完成上述步骤后,就可以按照官方升级流程操作了:
- 停止mongod服务
- 移除
mongodb的IgnorePkg限制,用pacman升级到3.6.1版本(此时WiredTiger和boost-libs的版本应该已经适配3.6.1,若之前没升级可以同步升级) - 启动mongod 3.6.1,再次连接CLI设置兼容版本:
db.adminCommand({setFeatureCompatibilityVersion: "3.6"})
这样就完成了完整的版本过渡,数据库应该能正常运行了。
5. 极端情况的备选方案(不推荐,仅万不得已时尝试)
如果实在无法启动3.4.9版本的mongod,可以尝试使用对应版本的WiredTiger工具直接操作数据库文件:
- 编译适配MongoDB 3.4.9的WiredTiger版本,得到
wt工具 - 用
wt工具检查数据库文件的状态,命令示例:
wt -h /var/lib/mongodb/ check
但这种方式风险较高,可能会损坏数据,只有在其他方法都失效时再考虑。
后续预防措施
- 修改
/etc/pacman.conf,调整CacheDir和CleanMethod,保留一定数量的旧包缓存,避免意外升级后无回退余地。 - 将
mongodb、boost-libs、wiredtiger同时加入IgnorePkg,直到你准备好手动升级MongoDB版本。
内容的提问来源于stack exchange,提问作者Tomas Varga
相关产品推荐
相关产品推荐

