On this page
db.copyDatabase()
在本页面
Definition
db.
copyDatabase
(* fromdb , todb , fromhost , username , password , mechanism *)- 在版本 3.0 中进行了更改:对
fromhost
实例进行身份验证时,db.copyDatabase()支持SCRAM-SHA-1和MONGODB-CR机制来对fromhost
用户进行身份验证。
- 在版本 3.0 中进行了更改:对
将数据库从一个mongod实例复制到当前mongod实例或在当前mongod内。 db.copyDatabase()包装copydb命令并接受以下参数:
Parameter | Type | Description |
---|---|---|
fromdb |
string | 源数据库的名称。 |
todb |
string | 目标数据库的名称。 |
fromhost |
string | 可选的。源mongod实例的主机名。忽略在同一mongod实例中复制数据库。 |
username |
string | 可选的。 fromhost MongoDB 实例上的用户名。用户验证到fromdb 。 |
有关更多信息,请参见对源 mongod 实例的身份验证。
| password
|字符串|可选。 fromhost
上用于身份验证的密码。该方法“不”以明文形式传输密码。
有关更多信息,请参见对源 mongod 实例的身份验证。
| mechanism
|字符串|可选。验证fromhost
上的username
和password
的机制。请指定:
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 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实例的
admin
数据库中运行db.copyDatabase(),该实例即接收复制数据的实例。db.copyDatabase()创建目标数据库(如果不存在)。
如果目标数据库存在并且目标数据库中不存在来自源数据库的集合,则db.copyDatabase()将集合从源数据库复制到目标数据库。如果目标数据库中存在源数据库中的任何集合,则db.copyDatabase()出错,并且不会从源数据库中复制任何剩余的集合。
db.copyDatabase()要求主机实例上有足够的可用磁盘空间用于复制的数据库。使用db.stats()操作检查源mongod实例上数据库的大小。
对源 mongod 实例的身份验证
- 如果要从另一个实施access control的mongod实例(
fromhost
)复制,则必须通过指定username
,password
和可选的mechanism
来认证fromhost
实例。该方法“不”以明文形式传输密码。
对fromhost
实例进行身份验证时,db.copyDatabase()将fromdb
用作指定用户的authentication database。
对
fromhost
实例进行身份验证时,db.copyDatabase()支持SCRAM-SHA-1和MONGODB-CR机制来对fromhost
用户进行身份验证。要认证到版本 2.6
fromhost
,必须指定MONGODB-CR
作为认证机制。参见从执行身份验证的 mongod 实例复制数据库。- 要从 3.0
fromhost
版本复制到 2.6 版实例,即,如果从 2.6 版实例运行该方法以从 3.0fromhost
版本复制,则您只能以MONGODB-CR
用户身份向fromhost
进行身份验证。
- 要从 3.0
有关所需访问和身份验证的更多信息,请参见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 control的mongod实例(fromhost
)复制,则必须通过指定username
,password
和可选的mechanism
来认证fromhost
实例。该方法“不”以明文形式传输密码。
对fromhost
实例进行身份验证时,db.copyDatabase()将fromdb
用作指定用户的authentication database。
对fromhost
实例进行身份验证时,db.copyDatabase()支持SCRAM-SHA-1和MONGODB-CR机制来对fromhost
用户进行身份验证。
要认证到版本 2.6
fromhost
,必须指定MONGODB-CR
作为认证机制。参见从执行身份验证的 mongod 实例复制数据库。要从 3.0
fromhost
版本复制到 2.6 版实例,即,如果从 2.6 版实例运行该方法以从 3.0fromhost
版本复制,则您只能以MONGODB-CR
用户身份向fromhost
进行身份验证。
来源是非 Management 员数据库
在版本 3.0 中更改。
如果源数据库是非admin
数据库,则您必须具有特权,这些特权指定源数据库上的find,listCollections和listIndexes操作,以及源数据库中system.js
集合上的find操作。
{ resource: { db: "mySourceDB", collection: "" }, actions: [ "find", "listCollections", "listIndexes" ] },
{ resource: { db: "mySourceDB", collection: "system.js" }, actions: [ "find" ] },
来源是 Management 员数据库
在版本 3.0 中更改。
如果源数据库是admin
数据库,则必须具有特权,这些特权指定admin
数据库上的find,listCollections和listIndexes操作,以及admin
数据库中的system.js
,system.users
,system.roles
和system.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
数据库,则必须具有特权,这些特权指定目标数据库上的insert和createIndex操作,以及目标数据库上system.js
集合上的insert操作。例如:
{ resource: { db: "myTargetDB", collection: "" }, actions: [ "insert", "createIndex" ] },
{ resource: { db: "myTargetDB", collection: "system.js" }, actions: [ "insert" ] }
从 Management 员数据库复制
如果源数据库是admin
数据库,则您必须具有在目标数据库上指定insert和createIndex操作,并在目标数据库中的system.js
,system.users
,system.roles
和system.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 control的mongod实例(fromhost
)复制,则必须通过指定username
,password
和可选的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