运维技术

全栈进阶之路
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

如何迁移MongoDB数据

发布于 2024-06-02 | 更新于 2024-08-10

最近在迁移测试环境数据,DBA大佬麻利地搭了新的MongoDB环境,程序都妥妥地部署到了新的测试环境,就剩下旧测试环境的数据没有迁移了。DBA大佬太忙,只能把这活儿摊派给我们了,没事,接下来咱们几招就能快速实现数据搬家。

如果你想迁移的数据就几条,那执行个insertMany语句一把梭哈就可以了,如果要迁移的数据比较多,就需要用到MongoDB的mongodumpmongorestore工具了。

1. 导入少量数据

如果你想迁移的数据少得可怜?一条命令解决:

1
2
3
4
5
6
7
8
9
10
11
# 选择数据库,如果不存在将自动创建
use yourDatabaseName

# 使用 insertMany 方法插入文档
db.yourCollectionName.insertMany([
{
"_id": ObjectId("10c22653119477703e000111"),
...
}
]);

这种方式适用于不太大的数据批量,因为它需要将所有文档一次性加载到内存中。对于更大的数据量,可能需要考虑分批处理或使用如 mongoimport 等工具。

2. 将数据从一个MongoDB实例迁移到另一个

2.1 安装MongoDB工具

这里帅旋用的是Mac电脑,所以以mac为例。

确保Mac 上已安装 MongoDB,并且 mongodumpmongorestore 命令可用。如果未安装,可以通过 Homebrew 安装:

1
2
brew tap mongodb/brew
brew install mongodb-community

2.2 使用 mongodump 导出数据

首先,从源数据库 mongo1.itzhai.comtestDb 数据库中导出 user 集合的数据:

1
mongodump --uri="mongodb://username:password@mongo1.itzhai.com:port/dbname?authSource=admin" --db=testDb --collection=user --out=itzhai-user

注意事项:

  • MongoDB 可能不是在尝试连接的数据库上进行身份验证,通常认证是在 admin 数据库进行。为此需要明确指定认证数据库。可以通过在连接字符串中添加 authSource 参数来指定认证数据库,也可以使用参数--authenticationDatabase admin来指定。
  • 在这里,将 username, password, mongo1.itzhai.com, testDb 替换为实际的值。
  • 如果希望导出某个集合的数据,可以加上--collection=collectionName,collectionName为你希望导出数据的集合,否则导出整个库的数据。也可以使用参数--authenticationDatabase admin来指定。
  • 在上述命令中,--out=itzhai-user替换为希望保存导出文件的本地目录路径。

2.3 使用 mongorestore 导入数据

确保在执行这些操作前备份了所有重要数据。

然后,使用 mongorestore 将数据导入目标数据库 mongo2.itzhai.com 中的 targetDBName 数据库的 user 集合。使用 --drop 选项确保在导入前删除目标集合的现有数据:

1
2
3
4
5
6
# 导入单个集合的数据
mongorestore --uri="mongodb://username:password@mongo2.itzhai.com?authSource=admin" --db=targetDBName --collection=targetDBName /path/to/dump/itzhai/user.bson

# 导入整个库的数据
mongorestore --uri="mongodb://username:password@mongo2.itzhai.com?authSource=admin" --db targetDBName /path/to/dump/sourceDBName

完成以上步骤后,你应该能够成功地将数据从一个 MongoDB 数据库迁移到另一个数据库,并覆盖目标数据库中的现有数据。

注意事项

  • 确保在执行这些操作前备份了所有重要数据。

  • 需要再uri中指定认证数据库,如上面的authSource=admin,也可以使用参数--authenticationDatabase admin来指定。

  • 如果希望在导入数据前,清空原来的数据,则需要在执行导入命令的时候添加**–drop参数**。

  • 以上命令中使用的是 MongoDB 的连接字符串(URI)。根据你的配置,可能需要添加用户名和密码。例如,如果数据库需要身份验证,URI 应该如下:

    1
    mongodb://username:password@host:port

如何删除原集合数据

  1. 删除部分集合
    1. 如果想删除某些集合的数据,重新导入,可以在执行导入命令前,先删除集合数据:
      1. db.collectionName.deleteMany({})
    2. 这里的 collectionName 是想要清空数据的集合名。{} 是一个空的查询对象,集合示没有任何筛选条件,因此会匹配并删除所有文档。
  2. 删除集合和数据
    1. 如果不仅想删除所有数据,而且想删除集合本身(包括其索引和其他相关属性),可以使用 drop() 方法。这个方法将完全删除集合。
      1. db.collectionName.drop()
    2. 同样,collectionName 是想要删除的集合名。

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/devops/migrate-mongodb-data.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。