最近在 WSL 和 macOS 下都遇到了 MongoDB 升级时报错的问题,记录一下踩的坑
1. 确认已经兼容新的版本
参考 https://docs.mongodb.com/manual/release-notes/4.0/#feature-compatibility 看一下当前设置的是多少
db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )
如果还不够新版本的,参考 https://docs.mongodb.com/manual/reference/command/setFeatureCompatibilityVersion/ 设置一下
db.adminCommand( { setFeatureCompatibilityVersion: "version" } )
注意版本跳太多了可能会失败,则需要启一个老版本把版本一步一步设上去(我的 WSL 就是从 2.6 跳 3.6 直接失败了,想 apt 退回去都不行,只能人肉下了个单独运行的 3.2 还是 3.4 做跳板,设完了才放弃)
2. 确认已经使用新的 YAML 格式配置文件
参考 https://docs.mongodb.com/manual/reference/configuration-options/,配置文件 Linux 一般是在 /etc/mongod.conf
,macOS 如果是 brew 装的,一般是在 /usr/local/etc/mongod.conf
如果不是 YAML 的可以参考 https://github.com/mongodb/mongo/blob/master/debian/mongod.conf 新写一个,对着原来的文件把相关参数改一下就好(主要是 dbPath
和 systemLog.path
,还有就是 processManagement
下要不要加 fork: true
)
3. 改用 wiredTiger 引擎
从 4.x 开始 MongoDB 就要放弃 mmapv1 引擎,尽快改成 wiredTiger
参考 https://docs.mongodb.com/manual/tutorial/change-standalone-wiredtiger/ 来做改动,大致步骤是
- 先在当前启动的 mongo 下做
mongodump
,备份已有数据 - 停掉当前 mongo(注意 macOS 下
brew services stop
可能没有真的停,再ps -el | grep mongo
看看还有没有进程) - 修改配置文件,把
storage.engine
的注释去掉并改为engine: wiredTiger
- 移除以前的
dbPath
下的所有文件(安全起见可以mv
走而不是rm -rf
) - 按新配置文件启动 mongo
- 用
mongorestore
来恢复之前的备份