如何在MongoShell中使用MongoDump?M10集群迁移免费集群报错解决
解决方案汇总
报错根因与修复方法
mongodump 是MongoDB官方提供的独立命令行工具,不属于MongoSH的内置操作指令。MongoDB Compass内置的MongoSH仅支持MongoDB操作语法、JavaScript语句,无法识别系统级命令行工具的参数,因此会抛出「Unexpected token, expected ";"」语法错误。
修复步骤如下:
- 本地提前安装MongoDB Database Tools工具包,确认包含
mongodump、mongorestore两个命令 - 打开本地操作系统终端(Windows为CMD/PowerShell,macOS/Linux为系统终端),在终端中执行相关备份恢复命令,而非在Compass的MongoSH中执行
- 旧集群数据备份命令示例:
mongodump --uri "mongodb+srv://<用户名>:<密码>@<旧M10集群连接地址>/<可选指定单个数据库名>" -o ./mongodb_backup - 新集群数据恢复命令示例:
mongorestore --uri "mongodb+srv://<用户名>:<密码>@<新免费集群连接地址>/" ./mongodb_backup
其他可用迁移方案
如果不想安装命令行工具,也可以选择以下更简便的方案:
方案1:Compass图形化导出导入(适合绝大多数场景)
- 用Compass连接旧M10集群,进入目标数据库,在集合页面右上角点击「导出数据」,选择BSON格式(可保留完整数据类型)导出到本地
- 断开旧集群连接,连接新的免费集群,创建同名数据库后进入集合页面,点击「导入数据」选择之前导出的文件即可完成迁移
方案2:MongoSH直接迁移(适合小数据量场景)
如果单库数据量小于100MB,可以直接在MongoSH中执行脚本完成迁移,无需导出本地文件:
// 建立旧集群连接 const oldCluster = Mongo("mongodb+srv://<用户名>:<密码>@<旧集群地址>"); const oldDb = oldCluster.getDB("<目标数据库名>"); // 建立新集群连接 const newCluster = Mongo("mongodb+srv://<用户名>:<密码>@<新集群地址>"); const newDb = newCluster.getDB("<目标数据库名>"); // 批量迁移所有集合 oldDb.getCollectionNames().forEach(collectionName => { const allDocs = oldDb.getCollection(collectionName).find().toArray(); if (allDocs.length > 0) { newDb.getCollection(collectionName).insertMany(allDocs); } });
注意:数据量超过100MB时不推荐该方案,容易出现连接超时、内存溢出问题
内容的提问来源于stack exchange,提问作者julz oh
相关产品推荐
相关产品推荐

