On this page
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
copydb创建目标数据库(如果不存在)。
如果目标数据库存在并且目标数据库中不存在来自源数据库的集合,则copydb将集合从源数据库复制到目标数据库。如果目标数据库中存在源数据库中的任何集合,则copydb出错,并且不会从源数据库中复制任何剩余的集合。
copydb要求主机实例上有足够的可用磁盘空间用于复制的数据库。使用db.stats()操作检查源mongod实例上数据库的大小。
对源 mongod 实例的身份验证
- 如果要从另一个实施access control的mongod实例(
fromhost
)复制,则必须通过指定username
,nonce
和key
对fromhost
实例进行身份验证。
对fromhost
实例进行身份验证时,copydb将fromdb
用作指定用户的authentication database。
- 在对
fromhost
实例进行身份验证时,copydb使用MONGODB-CR机制对fromhost
用户进行身份验证。要使用SCRAM-SHA-1 mechanism对用户进行身份验证,请使用db.copyDatabase()方法。
有关所需访问和身份验证的更多信息,请参见Required Access。
Concurrency
Indexes
MongoDB 在通过copydb
复制的数据库上执行索引的前台构建。前台index builds锁定数据库并阻止对该数据库进行所有其他操作,直到前台构建完成。构建索引时,对其他数据库的性能也可能会产生影响。
您可以使用db.currentOp()命令跟踪正在进行的索引创建操作。
Replica Sets
在read preference配置为将slaveOk
选项设置为true
的情况下,您可以在replica set的secondary成员上运行copydb。
Sharded Clusters
Required Access
在 2.6 版中进行了更改。
如果* source 数据库(fromdb
)的mongod实例强制access control,则您必须对 source *数据库具有适当的授权。
如果要从另一个实施access control的mongod实例(fromhost
)复制,则必须通过指定username
,nonce
和key
对fromhost
实例进行身份验证。
对fromhost
实例进行身份验证时,copydb将fromdb
用作指定用户的authentication database。
在对fromhost
实例进行身份验证时,copydb使用MONGODB-CR机制对fromhost
用户进行身份验证。要使用SCRAM-SHA-1 mechanism对用户进行身份验证,请使用db.copyDatabase()方法。
源数据库(fromdb)
来源是非 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" ] }
生成随机数和密钥
如果要从另一个实施访问控制的mongod实例复制,则必须包括username
,nonce
和key
才能以具有适当访问权限的用户身份对该实例进行身份验证。
Tip
db.copyDatabase()处理nonce
和key
的生成。
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 control的mongod实例(fromhost
)复制,则必须通过指定username
,nonce
和key
对fromhost
实例进行身份验证。
对fromhost
实例进行身份验证时,copydb将fromdb
用作指定用户的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>"
})