db.copyDatabase()

在本页面

Definition

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

将数据库从一个mongod实例复制到当前mongod实例或在当前mongod内。 db.copyDatabase()包装copydb命令并接受以下参数:

ParameterTypeDescription
fromdbstring源数据库的名称。
todbstring目标数据库的名称。
fromhoststring可选的。源mongod实例的主机名。忽略在同一mongod实例中复制数据库。
usernamestring可选的。 fromhost MongoDB 实例上的用户名。用户验证到fromdb


有关更多信息,请参见对源 mongod 实例的身份验证
| password |字符串|可选。 fromhost上用于身份验证的密码。该方法“不”以明文形式传输密码。
有关更多信息,请参见对源 mongod 实例的身份验证
| mechanism |字符串|可选。验证fromhost上的usernamepassword的机制。请指定:
SCRAM-SHA-1, or
MONGODB-CR(在 MongoDB 3.6 中已弃用)。
如果有线协议版本(maxWireVersion)大于或等于3(即 MongoDB 3.0 或更高版本),则db.copyDatabase默认为SCRAM-SHA-1。否则,默认为MONGODB-CR
指定MONGODB-CR以从 3.0 或更高版本的实例认证到 2.6.x fromhost版本。有关示例,请参见从执行身份验证的 mongod 实例复制数据库
3.0 版中的新功能。

Behavior

功能兼容版本

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

For example:

Instance 1Instance 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实例的admin数据库中运行db.copyDatabase(),该实例即接收复制数据的实例。

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

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

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

对源 mongod 实例的身份验证

  • 如果要从另一个实施access controlmongod实例(fromhost)复制,则必须通过指定usernamepassword和可选的mechanism来认证fromhost实例。该方法“不”以明文形式传输密码。

fromhost实例进行身份验证时,db.copyDatabase()fromdb用作指定用户的authentication database

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

  • 要认证到版本 2.6 fromhost,必须指定MONGODB-CR作为认证机制。参见从执行身份验证的 mongod 实例复制数据库

    • 要从 3.0 fromhost版本复制到 2.6 版实例,即,如果从 2.6 版实例运行该方法以从 3.0 fromhost版本复制,则您只能以MONGODB-CR用户身份向fromhost进行身份验证。

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

Concurrency

  • db.copyDatabase()clone不会生成源数据库的时间点快照。在复制过程中将流量写入源或目标数据库将导致数据集不同。

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

Indexes

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

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

Sharded Clusters

Required Access

在 2.6 版中进行了更改。

源数据库(fromdb)

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

如果要从另一个实施access controlmongod实例(fromhost)复制,则必须通过指定usernamepassword和可选的mechanism来认证fromhost实例。该方法“不”以明文形式传输密码。

fromhost实例进行身份验证时,db.copyDatabase()fromdb用作指定用户的authentication database

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

  • 要认证到版本 2.6 fromhost,必须指定MONGODB-CR作为认证机制。参见从执行身份验证的 mongod 实例复制数据库

  • 要从 3.0 fromhost版本复制到 2.6 版实例,即,如果从 2.6 版实例运行该方法以从 3.0 fromhost版本复制,则您只能以MONGODB-CR用户身份向fromhost进行身份验证。

来源是非 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" ] }

Example

从同一 mongod 实例复制

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

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

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

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

如果要从另一个实施access controlmongod实例(fromhost)复制,则必须通过指定usernamepassword和可选的mechanism来认证fromhost实例。该方法“不”以明文形式传输密码。

fromhost实例进行身份验证时,db.copyDatabase()fromdb用作指定用户的authentication database

在版本 3.0 中进行了更改:MongoDB 3.0 支持传递用于fromhost的身份验证机制。

以下操作从在example.net上运行并强制执行访问控制的 3.4 mongod版本实例中复制名为reporting的数据库。

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

See also