MongoDB 升级注意事项

最近在 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 新写一个,对着原来的文件把相关参数改一下就好(主要是 dbPathsystemLog.path,还有就是 processManagement 下要不要加 fork: true

3. 改用 wiredTiger 引擎

从 4.x 开始 MongoDB 就要放弃 mmapv1 引擎,尽快改成 wiredTiger

参考 https://docs.mongodb.com/manual/tutorial/change-standalone-wiredtiger/ 来做改动,大致步骤是

  1. 先在当前启动的 mongo 下做 mongodump,备份已有数据
  2. 停掉当前 mongo(注意 macOS 下 brew services stop 可能没有真的停,再 ps -el | grep mongo 看看还有没有进程)
  3. 修改配置文件,把 storage.engine 的注释去掉并改为 engine: wiredTiger
  4. 移除以前的 dbPath 下的所有文件(安全起见可以 mv 走而不是 rm -rf
  5. 按新配置文件启动 mongo
  6. mongorestore 来恢复之前的备份