问题:小李正在使用NestJS开发一个项目,其中使用了一个较新的Mongoogse/MongoDB Node.js驱动程序,要求连接到的MongoDB服务器版本至少是4.2,但是由于之前开发项目的需求,自己电脑上的MongoDB版本为3.4,因此需要升级MongoDB
1. 升级前的必要操作:全量备份
首先需要使用MongoDB官方工具中的mongodump进行完整备份(官方网址为:Download MongoDB Community Server | MongoDB)将原有数据库数据导出为BSON文件格式:
mongodump --host <Host> --port 27017 --out <storePath>
2. 升级:遵循版本跳跃规则
需要特别注意: MongoDB的升级不能够随意条约,一次只能升级一个主要版本,而且在升级到下一个主要版本之前,必须确保前一个版本能够稳定运行!因此,小李的升级路线为:3.4 => 3.6 => 4.0 => 4.2 => 4.4 => 5.0 => 6.0 => 7.0😭
① 检查当前数据库版本
在mongod服务运行的状态下,使用mongo;然后切换到admin数据库;其次检查当前的兼容性版本:
C:\Users\123>mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.4 //当前版本号
> use admin // 切换到admin数据库
> switched to db admin
> db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } ) // 检查当前的兼容性版本
> { "featureCompatibilityVersion" : "3.4", "ok" : 1 } // 还是3.4
> ^C
> bye
② 升级到3.6版本
在升级前,需要停掉当前的mongod服务,可以直接在服务管理器找到MongoDB终止服务。
小李在这一步骤,以为可以直接升级到4.0,尝试发现报错:
"s":"I", "c":"STORAGE", "id":6681001, "ctx":"initandlisten","msg":"exception in initAndListen: **MustDowngrade: Collection does not have UUID in KVCatalog.** Collection: admin.system.version, **terminating**" "s":"I", "c":"CONTROL", "id":20560, "ctx":"initandlisten","msg":"shutting down with **code:100**"
出现这个问题是因为缺少了UUID!MongoDB在3.6版本引入了一个重要的元数据变更:为所有集合(Collections)分配 了UUID,在旧版本3.4数据文件中的集合,包括关键的admin.system.version,没有UUID!!!因此,只能先更新到3.6版本。
在官方网址看到的只有最新的几个版本,但是可以在Archived releases找到历史版本,小李找了好久好久才发现(MongoDB Community Downloads | MongoDB)😭😭😭,下载3.6压缩包,然后找到bin文件夹中的mongod.exe直接替换之前文件夹里面的3.4版本的mongod.exe。
在命令行窗口使用以下命令启动服务:
mongod.exe --dbpath=G:\mongoDB\data --port 27017
然后再另一个命令行窗口连接Shell并设置兼容性:
C:\Users\123>mongo
MongoDB shell version v3.4.4
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.0 // 当前版本以升级到3.6
> use admin // 切换到admin数据库
> switched to db admin
> db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } ) // 设置兼容性版本到3.6
> { "ok" : 1 }
> ^C
> bye
③ 升级到4.0、4.2、4.4、5.0、6.0、7.0
小李看网上有人尝试从4.0直接升级到5.0,于是尝试了一下,发现还是不得行,于是只好一级级尝试,每一步的操作和上一步骤的一致,小李就列一下中间还可能出现的问题。
其中升级到4.2的时候,突然报错,然后回过头发现之前只是替换了mongod.exe,Shell仍然是老版本,因此同时也要替换一下新的mongo.exe。😭
此外,升级到6.0版本发现不再有mongo.exe。
升级到7.0时需要注意,官方说明在将 FCV 升级到7.0时,会强制要求用户确认。这是因为一旦FCV达到 7.0,就无法再降级到6.0或更早的版本了。(不可逆!!!),因此Shell中设置兼容性版本的命令为:
db.adminCommand( { setFeatureCompatibilityVersion: "7.0", confirm: true } )
3. 升级后的操作
首先需要删除旧的MongoDB服务,在Windows PowerShell 或命令提示符中,以管理员身份运行:sc delete MongoDB,然后在MongoDB安装目录下创建一个名为mongod.cfg文件,输入以下基本配置:
systemLog:
destination: file
path: G:\mongoDB\log\mongod.log # 创建一个log目录
logAppend: true
storage:
dbPath: G:\mongoDB\data # 数据路径
net:
port: 27017
bindIp: 127.0.0.1 # 保持本地绑定以符合当前的配置
然后重新创建服务,并重新启动服务:
"C:\Path\To\Your\7.0\mongod.exe" --config "G:\mongoDB\mongod.cfg" --install
net start MongoDB
最终需要导入原来的数据,此时需要注意当前使用MongoDB官方工具中的mongostore的版本号一定也要兼容最新版本MongoDB,因为小李之前使用的也是老版本,然后使用老版本的mongostore导进数据一直出错,于是又更新了MongoDB工具,最终终于成功!!!😭😭😭😇😇😇