db.copyDatabase()

在本页面

定义

  • db. copyDatabase(fromdb,todb,fromhost,username,password,mechanism)

将数据库从一个mongod实例复制到当前mongod实例或当前mongoddb.copyDatabase()包装COPYDB命令并采用以下 arguments:

参数类型描述
fromdb源数据库的名称。
todb目标数据库的名称。
fromhost可选的。源mongod实例的主机名。省略在同一个mongod实例中复制数据库。
username可选的。 fromhost MongoDB 实例上用户的 name。用户对fromdb进行身份验证。
有关详细信息,请参阅对源 mongod 实例的身份验证
password可选的。 fromhost上的密码用于身份验证。该方法不会**以明文形式传输密码。
有关更多信息,请参阅对源 mongod 实例的身份验证
mechanism可选的。验证fromhost上的usernamepassword的机制。指定:
SCRAM-SHA-1
MONGODB-CR(在 MongoDB 3.6 中不推荐使用)。如果有线协议 version(maxWireVersion)大于或等于3(i.e.MongoDB 版本 3.0 或更高版本),
db.copyDatabase默认为SCRAM-SHA-1。否则,默认为MONGODB-CR
指定MONGODB-CR以从 version 3.0 实例或更高版本对 version 2.6.x fromhost进行身份验证。有关 example,请参阅从实施身份验证的 mongod 实例复制数据库
version 中的新内容 3.0.

行为

Feature Compatibility Version

您不能在具有featureCompatibilityVersion(FCV) 3.6 的mongod实例和 MongoDB version 3.4 以及之前的mongod实例之间复制数据。

例如:

实例 1实例 2
Version 3.6 mongod与 FCV 3.6Version 3.6 mongod与 FCV 3.6可以复制数据。
Version 3.6 mongod与 FCV 3.6Version 3.6 mongod与 FCV 3.4可以复制数据。
Version 3.6 mongod与 FCV 3.6Version 3.4 mongod与 FCV 3.4无法复制数据。实例 2 必须是 MongoDB version 3.6
Version 3.6 mongod与 FCV 3.4Version 3.4 mongod与 FCV 3.4可以复制数据。
Version 3.6 mongod与 FCV 3.4Version 3.2 mongod可以复制数据。

复制数据的操作包括:

目的地

  • Run db.copyDatabase()在目标mongod实例的admin数据库中,i.e。接收复制数据的实例。

  • 如果目标数据库不存在,db.copyDatabase()将创建目标数据库。

  • 如果目标数据库存在且目标数据库中不存在源数据库的集合,则db.copyDatabase()将集合从源数据库复制到目标数据库。如果目标数据库中存在源数据库中的任何集合,则db.copyDatabase()会出错并且不会从源数据库中复制任何剩余集合。

  • db.copyDatabase()要求复制数据库的 host 实例上有足够的可用磁盘空间。使用db.stats()操作检查源mongod实例上的数据库大小。

对源 mongod 实例的身份验证

  • 如果从强制访问控制的另一个mongod实例(fromhost)进行复制,则必须通过指定usernamepassword和可选的mechanism来对fromhost实例进行身份验证。该方法不会**以明文形式传输密码。

在对fromhost实例进行身份验证时,db.copyDatabase()使用fromdb作为指定用户的认证数据库

  • 在对fromhost实例进行身份验证时,db.copyDatabase()支持SCRAM-SHA-1MONGODB-CR机制来验证fromhost用户。

  • 要对 version 2.6 fromhost进行身份验证,必须指定MONGODB-CR作为身份验证机制。见从实施身份验证的 mongod 实例复制数据库

  • 要从 version 3.0 fromhost复制到 version 2.6 实例,i.e。如果从 version 2.6 实例中运行方法以从 version 3.0 fromhost复制,则只能作为MONGODB-CR用户对fromhost进行身份验证。

有关所需访问和身份验证的详细信息,请参阅必需的访问权

并发

  • db.copyDatabase()克隆不生成源数据库的 point-in-time 快照。在复制 process 期间将流量写入源或目标数据库将导致不同的数据集。

  • db.copyDatabase()在其操作期间不会锁定目标服务器,因此副本有时会 yield 以允许其他操作完成。

索引

MongoDB 对通过db.copyDatabase()复制的数据库执行索引的前台构建。 Foreground 索引构建锁定数据库并阻止该数据库上的所有其他操作,直到前台 build 完成。索引 build 时,对其他数据库也可能存在 performance 影响。

您可以使用db.currentOp()命令跟踪正在进行的索引创建操作。

Sharded Clusters

必需的访问权

更改了 version 2.6.

源数据库(fromdb)

如果源数据库(fromdb)的mongod实例强制执行访问控制,则必须对源数据库具有适当的授权。

如果从强制访问控制的另一个mongod实例(fromhost)进行复制,则必须通过指定usernamepassword和可选的mechanism来对fromhost实例进行身份验证。该方法不会**以明文形式传输密码。

在对fromhost实例进行身份验证时,db.copyDatabase()使用fromdb作为指定用户的认证数据库

在对fromhost实例进行身份验证时,db.copyDatabase()支持SCRAM-SHA-1MONGODB-CR机制来验证fromhost用户。

  • 要对 version 2.6 fromhost进行身份验证,必须指定MONGODB-CR作为身份验证机制。见从实施身份验证的 mongod 实例复制数据库

  • 要从 version 3.0 fromhost复制到 version 2.6 实例,i.e。如果从 version 2.6 实例中运行方法以从 version 3.0 fromhost复制,则只能作为MONGODB-CR用户对fromhost进行身份验证。

来源是 non-admin 数据库

更改了 version 3.0.

如果源数据库是非admin数据库,则必须具有在源数据库上指定listCollectionslistIndexes操作的权限,以及在源数据库中指定system.js集合上的操作。

{ resource: { db: "mySourceDB", collection: "" }, actions: [ "find", "listCollections", "listIndexes" ] },
{ resource: { db: "mySourceDB", collection: "system.js" }, actions: [ "find" ] },

来源是管理员数据库

更改了 version 3.0.

如果源数据库是admin数据库,则必须具有在admin数据库上指定listCollectionslistIndexes操作的权限,以及admin数据库中system.jssystem.userssystem.rolessystem.version集合上的操作。例如:

{ resource: { db: "admin", collection: "" }, actions: [ "find",  "listCollections", "listIndexes" ] },
{ resource: { db: "admin", collection: "system.js" }, actions: [ "find" ] },
{ resource: { db: "admin", collection: "system.users" }, actions: [ "find" ] },
{ resource: { db: "admin", collection: "system.roles" }, actions: [ "find" ] },
{ resource: { db: "admin", collection: "system.version" }, actions: [ "find" ] }

目标数据库(todb)

如果目标数据库(todb)的mongod实例强制执行访问控制,则必须对目标数据库具有适当的授权。

从 non-admin 数据库复制

如果源数据库不是admin数据库,则必须具有在目标数据库上指定插入上的 createIndex操作的权限,以及目标数据库中system.js集合上的插入操作。例如:

{ resource: { db: "myTargetDB", collection: "" }, actions: [ "insert", "createIndex" ] },
{ resource: { db: "myTargetDB", collection: "system.js" }, actions: [ "insert" ] }

从管理员数据库复制

如果源数据库是admin数据库,则必须具有在目标数据库上指定插入上的 createIndex操作的权限,以及目标数据库中system.jssystem.userssystem.rolessystem.version集合上的插入操作。例如:

{ resource: { db: "myTargetDB", collection: "" }, actions: [ "insert", "createIndex" ] },
{ resource: { db: "myTargetDB", collection: "system.js" }, actions: [ "insert" ] },
{ resource: { db: "myTargetDB", collection: "system.users" }, actions: [ "insert" ] },
{ resource: { db: "myTargetDB", collection: "system.roles" }, actions: [ "insert" ] },
{ resource: { db: "myTargetDB", collection: "system.version" }, actions: [ "insert" ] }

从相同的 mongod 实例复制

要在同一个mongod实例中复制,请省略fromhost

以下操作将名为records的数据库复制到名为archive_records的数据库中:

db.copyDatabase('records', 'archive_records')

从实施身份验证的 mongod 实例复制数据库

如果从强制访问控制的另一个mongod实例(fromhost)进行复制,则必须通过指定usernamepassword和可选的mechanism来对fromhost实例进行身份验证。该方法不会**以明文形式传输密码。

在对fromhost实例进行身份验证时,db.copyDatabase()使用fromdb作为指定用户的认证数据库

更改 version 3.0:MongoDB 3.0 支持传递用于fromhost的身份验证机制。

以下操作从上运行的 version 3.4 mongod实例复制名为reporting的数据库,并强制执行访问控制。

db.copyDatabase(
   "reporting",
   "reporting_copy",
   "example.net",
   "reportUser",
   "abc123",
   "SCRAM-SHA-1"
)

也可以看看 克隆