copydb

在本页面

Definition

{ copydb: 1,
  fromhost: <hostname>,
  fromdb: <database>,
  todb: <database>,
  slaveOk: <bool>,
  username: <username>,
  nonce: <nonce>,
  key: <key>,
  writeConcern: <document>,
  bypassDocumentValidation: <boolean> }

copydb接受以下选项:

Field Type Description
fromhost string 可选的。源mongod实例的主机名。忽略在同一mongod实例中复制数据库。
fromdb string 源数据库的名称。
todb string 目标数据库的名称。
slaveOk boolean 可选的。将slaveOK设置为true以允许copydb从辅助成员以及主要成员复制数据。 fromhost也必须设置。
username string 可选的。 fromhost MongoDB 实例上的用户名。用户验证到fromdb


有关更多信息,请参见对源 mongod 实例的身份验证
| nonce | string |可选。使用copydbgetnonce命令在远程服务器上生成的一次性使用共享密钥,即fromhost
有关更多信息,生成随机数和密钥
| key | string |可选。用于身份验证的密码的哈希。有关更多信息,生成随机数和密钥
| writeConcern |文档|可选。表示该操作的write concern的文档。忽略使用默认的写关注。
| bypassDocumentValidation |布尔值|可选。使copydb在操作过程中绕过文档验证。这使您可以插入不符合验证要求的文档。
版本 3.2 中的新功能。

mongo shell 为copydb命令提供db.copyDatabase()包装器。

在对fromhost实例进行身份验证时,copydb使用MONGODB-CR机制对fromhost用户进行身份验证。要使用SCRAM-SHA-1 mechanism对用户进行身份验证,请使用db.copyDatabase()方法。

Behavior

功能兼容版本

您无法在具有featureCompatibilityVersion (FCV) 3.6 的mongod实例与 MongoDB 版本 3.4 和更早的mongod实例之间复制数据。

For example:

Instance 1 Instance 2
具有 FCV 3.6 的 3.6 版mongod 具有 FCV 3.6 的 3.6 版mongod 可以复制数据。
具有 FCV 3.6 的 3.6 版mongod 具有 FCV 3.4 的 3.6 版mongod 可以复制数据。
具有 FCV 3.6 的 3.6 版mongod 具有 FCV 3.4 的 3.4 版mongod 无法复制数据。实例 2 必须是 MongoDB 3.6 版
具有 FCV 3.4 的 3.6 版mongod 具有 FCV 3.4 的 3.4 版mongod 可以复制数据。
具有 FCV 3.4 的 3.6 版mongod 版本 3.2 mongod 可以复制数据。

复制数据的操作包括:

Destination

对源 mongod 实例的身份验证

fromhost实例进行身份验证时,copydbfromdb用作指定用户的authentication database

有关所需访问和身份验证的更多信息,请参见Required Access

Concurrency

Indexes

MongoDB 在通过copydb复制的数据库上执行索引的前台构建。前台index builds锁定数据库并阻止对该数据库进行所有其他操作,直到前台构建完成。构建索引时,对其他数据库的性能也可能会产生影响。

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

Replica Sets

read preference配置为将slaveOk选项设置为true的情况下,您可以在replica setsecondary成员上运行copydb

Sharded Clusters

Required Access

在 2.6 版中进行了更改。

如果* source 数据库(fromdb)的mongod实例强制access control,则您必须对 source *数据库具有适当的授权。

如果要从另一个实施access controlmongod实例(fromhost)复制,则必须通过指定usernamenoncekeyfromhost实例进行身份验证。

fromhost实例进行身份验证时,copydbfromdb用作指定用户的authentication database

在对fromhost实例进行身份验证时,copydb使用MONGODB-CR机制对fromhost用户进行身份验证。要使用SCRAM-SHA-1 mechanism对用户进行身份验证,请使用db.copyDatabase()方法。

源数据库(fromdb)

来源是非 Management 员数据库

在版本 3.0 中更改。

如果源数据库是非admin数据库,则您必须具有特权,这些特权指定源数据库上的findlistCollectionslistIndexes操作,以及源数据库中system.js集合上的find操作。

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

来源是 Management 员数据库

在版本 3.0 中更改。

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

{ 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)

如果* target 数据库(todb)的mongod实例强制access control,则您必须对 target *数据库具有适当的授权。

从非 Management 员数据库复制

如果源数据库不是admin数据库,则必须具有特权,这些特权指定目标数据库上的insertcreateIndex操作,以及目标数据库上system.js集合上的insert操作。例如:

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

从 Management 员数据库复制

如果源数据库是admin数据库,则您必须具有在目标数据库上指定insertcreateIndex操作,并在目标数据库中的system.jssystem.userssystem.rolessystem.version集合上指定insert操作的特权。例如:

{ 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实例复制,则必须包括usernamenoncekey才能以具有适当访问权限的用户身份对该实例进行身份验证。

Tip

db.copyDatabase()处理noncekey的生成。

nonce

nonce是您使用copydbgetnonce命令从远程服务器请求的一次性密码,如下所示:

mynonce = db.adminCommand( { copydbgetnonce : 1, fromhost: <hostname> } ).nonce

如果直接在远程主机上运行copydbgetnonce命令,则可以省略copydbgetnonce命令中的fromhost字段。

key

key是如下生成的哈希值:

hex_md5(mynonce + username + hex_md5(username + ":mongo:" + password))

Examples

从同一 mongod 实例复制

要从同一主机复制,请省略fromhost字段。

以下命令将test数据库复制到当前mongod实例上的新records数据库:

db.adminCommand({
   copydb: 1,
   fromdb: "test",
   todb: "records"
})

从远程主机复制到当前主机

要从远程主机复制,请包括fromhost字段。

以下命令将test数据库从远程主机example.net复制到当前mongod实例上的新records数据库:

db.adminCommand({
   copydb: 1,
   fromdb: "test",
   todb: "records",
   fromhost: "example.net"
})

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

如果要从另一个实施access controlmongod实例(fromhost)复制,则必须通过指定usernamenoncekeyfromhost实例进行身份验证。

fromhost实例进行身份验证时,copydbfromdb用作指定用户的authentication database

Note

在对fromhost实例进行身份验证时,copydb使用MONGODB-CR机制对fromhost用户进行身份验证。要使用SCRAM-SHA-1 mechanism对用户进行身份验证,请使用db.copyDatabase()方法。

以下命令从远程主机example.net上运行的mongod实例复制test数据库,并实施访问控制:

db.adminCommand({
   copydb: 1,
   fromdb: "test",
   todb: "records",
   fromhost: "example.net",
   username: "reportingAdmin",
   nonce: "<nonce>",
   key: "<passwordhash>"
})
首页