对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。
Make the MongoDB docs better! We value your opinion. Share your feedback for a chance to win $100.
MongoDB Branding Shape
Click here >
Docs 菜单

迁移 mongomirror

是一个工具,用于将数据从现有MongoDB副本集手动迁移到MongoDB Atlas副本集。请参阅下载 mongomirror。

不要求您关闭现有副本集或应用程序,不导入用户或角色数据,也不复制 config数据库。

用于:

  • 将数据集从 MongoDB Atlas 外部托管的 MongoDB 部署 一次性迁移到 MongoDB Atlas 集群。

  • 将数据集从一个 Atlas 集群一次性迁移到一个 Atlas 集群。

另请参阅选择数据导入和迁移工具

  • 源MongoDB 部署必须是副本集。如果源是独立运行的实例,则在运行之前,请将独立运行的MongoDB 部署转换为副本集。

  • 源副本集必须运行 2.6 或更高版本的 MongoDB。

  • 源MongoDB副本集不能是免费集群(以前称为 M0)或 Flex集群。

  • 源MongoDB副本集不能包含时间序列集合中的数据。

  • 在此过程中,始终请勿更改 featureCompatibilityVersion 标志。

  • 从 MongoDB 4.4 或更早版本迁移到运行 MongoDB 7.0 或更高版本的 Atlas 集群时,请从集合中删除任何 geoHaystack 索引

  • TTL 索引不兼容。删除所有现有 TTL 索引,并在迁移流程完成后重建它们。如果因其对查询性能十分重要而不想删除现有索引,则请 联系支持人员 以了解备用选项。

  • 在迁移过程中,不要对命名空间进行任何更改,例如使用 renameCollection 命令或执行包含 $out 聚合阶段的聚合管道。

  • 您不能将 renameCollection 命令或 $out 聚合阶段用作初始同步的一部分,初始同步会作为进程的一部分运行。

  • 在迁移的初始同步阶段,请勿重新启动主节点。

  • 如果 MongoDB 部署包含的索引的键值超过索引键值限制,则在启动实时迁移之前修改索引,使其不包含过大的键值。

必须具有源副本集的网络访问权限。如果源副本集需要身份验证,请在运行时包含用户凭证。指定至少具有以下特权的数据库用户:

如果不存在这样的用户,请在源MongoDB副本集创建该用户。不同的MongoDB Server版本具有不同的内置角色。根据MongoDB Server版本选择内置角色,然后在mongosh 中运行相应命令:

  • 对于源集群,用户必须拥有 readAnyDatabaseclusterMonitorbackup 角色。

    要验证将运行实时迁移过程的数据库用户是否具有这些角色,请在 admin 数据库上运行 db.getUser() 命令。

    use admin
    db.getUser("admin")
    {
    "_id" : "admin.admin",
    "user" : "admin",
    "db" : "admin",
    "roles" : [
    {
    "role" : "backup",
    "db" : "admin"
    },
    {
    "role" : "clusterMonitor",
    "db" : "admin"
    }
    {
    "role" : "readAnyDatabase",
    "db" : "admin"
    }
    ]
    } ...

    此外,源集群的数据库用户必须具有读取 admin 数据库的 oplog 的角色。如需了解更多信息,请参阅 Oplog 访问权限

  • 对于运行 MongoDB 3.4 的源集群,用户至少必须拥有 clusterMonitorreadAnyDatabase 角色。例如:

    use admin
    db.createUser(
    {
    user: "mySourceUser",
    pwd: "mySourceP@$$word",
    roles: [ "clusterMonitor", "readAnyDatabase" ]
    }
    )
  • 对于运行 MongoDB 3.2 的源集群,用户必须至少拥有 clusterManagerreadAnyDatabase 角色,以及对 local 数据库的读取权限。为此,需要一个自定义角色,而您可使用以下命令创建该角色:

    use admin
    db.createRole(
    {
    role: "migrate",
    privileges: [
    { resource: { db: "local", collection: "" }, actions: [ "find" ] }
    ],
    roles: ["readAnyDatabase", "clusterManager"]
    }
    )
    db.createUser(
    {
    user: "mySourceUser",
    pwd: "mySourceP@$$word",
    roles: [ "migrate" ]
    }
    )
  • 对于运行 MongoDB 2.6 或 3.0 的源集群,用户必须至少拥有 readAnyDatabase 角色。例如:

    use admin
    db.createUser(
    {
    user: "mySourceUser",
    pwd: "mySourceP@$$word",
    roles: [ "readAnyDatabase" ]
    }
    )

目标 Atlas 部署:

  • 不能是 Free集群或 Flex集群。

  • 必须是副本集。

  • 必须采用与源集群 MongoDB 版本相同或更高的版本。请参阅升级路径

  • 不得包含任何与源集群重叠的命名空间。如果在目标集群上检测到重叠的命名空间,则会在启动此进程之前失败。如果目标集群包含重叠的命名空间,请使用 --drop 从目标集群中删除所有数据,或使用 --includeNamespace 列出要从源集群导入的命名空间。

  • 必须在其 IP 访问列表中包含以下任一对象:

    • 运行以下命令的服务器的公共IP解决,或者

    • 如果设置为 VPC 对等互连,则为对等方的 VPC CIDR 区块(或子集) 或对等 VPC 的安全组。

    注意

    要查找集群中任何节点的公共 IP 地址,请从命令行使用 nslookup 工具。要了解更多信息,请参阅 Atlas 集群的公网 IP 是否有变化?

必须具有目标集群的网络访问权限。

必须指定具有Atlas admin角色的数据库用户才能运行。要学习;了解更多信息,请参阅配置数据库用户。

重要

不支持在MongoDB 6.0+ 源集群和 6.0+ 目标集群之间进行迁移。不能用于从源副本集6.0.x 或更高版本迁移到目标副本集6.0.x 或更高版本。

您可用于从以前版本上的源副本集迁移到MongoDB版本 6.0 的目标副本集。

或者,您可以将源副本集升级到 6.0+ 或 7.0+,并使用此实时迁移过程将升级后的副本集迁移到 Atlas。

支持以下迁移路径。

源副本集
MongoDB版本
目标Atlas副本集
MongoDB版本

5.0

6.0

4.4

6.0

4.2

6.0

4.0

6.0

3.6

6.0

3.4

6.0

3.2

6.0

3.0

6.0

2.6

6.0

注意

在 macOS 64 位系统中,下载 mongomirror 文件后首次尝试打开时,会显示安全警报。要继续,请参阅通过覆盖安全性设置来打开应用。

当您启动 时,它会:

  1. 通过TLS连接到Atlas 。

  2. 执行初始同步,将现有 MongoDB 副本集中的集合复制到 Atlas 中的目标集群。

  3. 在初始同步之后,持续跟踪副本集的oplog以获取传入的更改,并在Atlas中的目标集群上重放这些更改。不会复制 config数据库。如果您在源集群或目标集群上启用线路压缩,则使用线路压缩,并使用 --compressors 指定允许的压缩库。

    在前台构建目标集群上的所有索引,无论索引是如何在源集群上构建的。前台索引构建区块对数据库的所有其他操作。要学习;了解更多信息,请参阅对已填充集合的索引构建操作。

一旦启动,将持续运行,直到您将其关闭:

  • 如果在初始同步阶段关闭,则在重新启动之前,请检查目标集群是否为空,或使用--drop运行。

  • 如果在oplog 跟踪阶段关闭,该进程将停止跟踪oplog。您可以重新启动以使用 --bookmarkFile 从最后一条已处理的oplog记录继续追踪。

1

如果源副本集需要身份验证,则必须在运行时包含用户凭证。有关要求,请参阅源副本集所需的访问权限。

请记下该用户的用户名和密码,因为运行 mongomirror 时必须指定这些档案。

2
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含项目的组织。

  2. 如果尚未显示,请从导航栏的 Projects 菜单中选择您的项目。

  3. 在侧边栏中,单击 Security 标题下的 Database & Network Access

显示“数据库和网络访问”页面。

3

必须指定具有Atlas admin角色的数据库用户才能运行。有关创建数据库用户的文档,请参阅配置数据库用户

如果不存在该用户,则创建该用户:

  1. 如果尚未显示,请单击 Database Users 标签页。

  2. 单击 Add New Database User(添加新的数据库用户)。

  3. 添加 Atlas admin 用户。

记下为新用户选择的用户名和密码,因为您必须在运行时指定这些凭证。

4

如果要运行的托管不在集群的IP访问列表中,更新该列表。您可以指定以下任一项:

  • 将运行的服务器的公共 IP 地址,或者

  • 如为 VPC 对等互连进行设置,则为对等互连的 VPC CIDR 区块(或子网)或对等互连 VPC 的安全群组。

5
  1. 如果尚未显示,请从导航栏上的 Organizations 菜单中选择包含所需项目的组织。

  2. 如果尚未显示,请从导航栏的Projects菜单中选择所需的项目。

  3. 在侧边栏中,单击 Database 标题下的 Clusters

会显示集群页面。

6

单击要将数据迁移到 Atlas 集群的 Connect

7

您可以从 Atlas 用户界面获取 Atlas 集群的主机名信息。

注意

您无需使用驱动程序即可迁移数据。

  1. Connect 对话框中单击 Shell

  2. 从下拉列表中选择 3.4 or earlier。连接字符串应类似于以下示例。为便于阅读,此示例已分为多行:

    mongodb://<db_username>:<db_password>@
    00.foo.mongodb.net:27017,
    01.foo.mongodb.net:27017,
    02.foo.mongodb.net:27017/test?
    ssl=true&replicaSet=myAtlasRS&authSource=admin
  3. 在文本编辑器中,粘贴replicaSet的值,添加正斜杠 ( / ),然后将主机列表追加为逗号分隔值,如下例所示:

    myAtlasRS/00.foo.mongodb.net:27017,01.foo.mongodb.net:27017,02.foo.mongodb.net:27017

在下一步中,将此值用于 --destination

8

要完成迁移过程,请验证数据传输并切换到 Atlas。

完成初始同步并跟踪副本集的oplog后,您可以切换到目标Atlas 集群。

1

此举可确保不对源集群执行其他写入操作。

2

这表示源集群和目标集群处于一致状态。

3

Atlas 集群更新后,请停止 mongomirror

4

使用以下验证策略之一,验证数据是否已传输到目标集群。只有在确保源集群或目标集群写入数据后,才能使用以下验证方法。

  • 请使用 db.collection.countDocuments() 在源集群和目标集群的每个集合上执行方法,以获取文档计数并在集群之间进行比较。

  • 编写脚本,在源集群上查询集合,然后检查目标集群上是否存在具有相同值的正确文档、索引、集合、元数据和视图。在脚本中,对源集群和目标集群使用以下命令:

5

通过集群面板上的 Connect(连接)按钮提供的 Atlas 连接字符串,更新客户端应用程序。

有关连接Atlas的详细信息,请参阅通过客户端库连接到集群。

将其进度记录到终端中的标准输出。在初始同步期间,为其复制的每个集合日志一个进度条。示例:

2024-08-09T16:35:50.227-0000 [#....................] park.events 2179/34184 (6.4%)
2024-08-09T16:35:50.227-0000 [#############........] zoo.animals 29000/49778 (58.3%)

跟踪oplog时,记录源集群上的最新oplog条目与目标集群上最后处理的oplog条目之间的延迟时间(以秒为单位)。示例:

2024-12-12T16:22:17.027-0800 Current lag from source: 6s

6 秒的延迟时间意味着处理的最后一个 oplog 条目源集群上可用的最新oplog条目早 6 秒。

注意

赶上所需的时间可能大于或小于 6 秒,具体取决于每秒到达的条目数。

0 秒的延迟时间表示正在处理比最新oplog条目晚到一秒以内的条目。

如果源集群具有索引,则在目标集群上构建相同的索引。进度日志显示索引构建进程的开始时间和结束时间。要查看索引构建进度,您可以:

  • 在目标集群的主节点上使用 currentOp 命令。command 字段显示有关运行操作的信息。索引构建条目如下所示:

    "command" : {
    "createIndexes" : "perfs",
    "indexes" : [
    {
    "key" : {
    "animal" : "text"
    },
    "name" : "animal_text"
    }
    ]...
  • 下载目标集群的 mongodb 日志,然后搜索索引相关行的最新条目。与索引构建相关的日志消息如下所示:

    {"t":{"$date":"2024-08-09T16:35:50.227+00:00"},"s":"I", "c":"INDEX", "id":20447, "ctx":"conn1080","msg":"Index build: completed","attr":{"buildUUID":{"uuid":{"$uuid":"c4a62739-bf19-456d-bbd6-7baa29f1063b"}}}}

为避免争用网络和 CPU 资源,请在副本集的mongod实例主机以外的主机上运行。

  • 会影响源副本集的性能,其效果类似于存在从节点:

    • 对于初始同步阶段,负载会随着数据集的大小而扩展变化。

    • 初始同步完成后,负载会以每小时使用 oplog 千兆字节的速度递增。

有关语法、选项和示例,请参阅 mongomirror 参考页面。