Mongodb2.6 数据库和集合的复制 1. db.cloneCollection() db.cloneCollection(from, collection, query) 在不同的mongodb实例间复制数据,db.cloneCollection是cloneCollection数据库命令的一个外在体现。 function (from, collection, query) { assert( isString(from) && from.length ); assert( isString(collection) && collection.length ); collection = this._name + "." + collection; query = query || {}; return this._dbCommand( { cloneCollection:collection, from:from, query:query } ); } 参数: from string 包含需要复制的表的mongodb实例主机名 collection string 数据实例中需要复制的表名,该命令只可以复制远程mongodb实例上相同数据库名称的表 query document 可选的选项。标准的查询语句过滤掉不需要的文档 db.cloneCollection()不允许通过mongos来复制表,只能通过mongod实例来操作。 示例: 192.168.11.51 mongod实例mydb库,bar集合: { "_id" : ObjectId("53687d9df433cf04b788c6d1"), "name" : "dog" } { "_id" : ObjectId("53687ff1f433cf04b788c6d2"), "name" : "cat" } { "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" } 本地mongod实例mydb库,复制远程主机的bar集合中满足查询条件的文档: db.cloneCollection("192.168.11.52", "bar", {"name" : "tiger"}) db.bar.find(); { "_id" : ObjectId("53687ff4f433cf04b788c6d3"), "name" : "tiger" } 2. db.cloneDatabase() db.cloneDatabase("hostname") 复制远程主机的数据库到本地,该命令假设远程mongodb实例中拥有与本地相同的数据库名称。 hostname string 包含需要复制的数据库的mongodb实例主机名 db.cloneDatabase是clone数据库命令的一个外在体现。 function (from) { assert( isString(from) && from.length ); return this._dbCommand( { clone: from } ); } 示例: 192.168.11.51 mongod实例mydb库, 本机mongodb实例: use mydb db.dropDatabase(); db.cloneDatabase("192.168.11.52"); 3. db.copyDatabase() db.copyDatabase(fromdb, todb, fromhost, username, password) 从远程主机复制数据库到本地,或从本地复制数据库到远程主机。 db.copyDatabase是copydb数据库命令的一个外在体现。 function (fromdb, todb, fromhost, username, password) { assert( isString(fromdb) && fromdb.length ); assert( isString(todb) && todb.length ); fromhost = fromhost || ""; if ( username && password ) { var n = this._adminCommand( { copydbgetnonce : 1, fromhost:fromhost } ); return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb, todb:todb, username:username, nonce:n.nonce, key:this.__pwHash( n.nonce, userna me, password ) } ); } else { return this._adminCommand( { copydb:1, fromhost:fromhost, fromdb:fromdb, todb:todb } ); } } 参数: fromdb string 源数据库名称 todb string 目标数据库名称 fromhost string 可选项,源数据库的主机名。如果是同一主机,忽略该选项 username string 可选项,源主机名用户名 password string 可选项,源主机名用户名对应密码 属性: db.copyDatabase()运行在目标主机的mongod实例上。 db.copyDatabase()会创建目标数据库,如果其原来不存在。 db.copyDatabase()需要目标机器上有足够的空间进行复制。 db.copyDatabase()并不会产生目标数据库的即时快照。如果在复制过程中在源或目标库发生读写操作,会导致数据库不一致。 db.copyDatabase()在操作过程中并不会锁住目标主机,所以复制过程中可能出现暂时的中断来完成其他操作。 源数据库(fromdb) mongodb2.6需要在源主机和目标主机拥有以下权限来执行copydb。 1)如果源主机数据库不是admin,必须确保拥有以下权限: { resource: { db: "mySourceDB", collection: "" }, actions: [ "find" ] } { resource: { db: "mySourceDB", collection: "system.js" }, actions: [ "find" ] } 如果源主机是一台远程主机,必须确保拥有以下权限: { resource: { db: "mySourceDB", collection: "system.indexes" }, actions: [ "find" ] } { resource: { db: "mySourceDB", collection: "system.namespaces" }, actions: [ "find" ] } 2)如果源主机数据库是admin,必须确保拥有以下权限: { resource: { db: "admin", collection: "" }, actions: [ "find" ] } { 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" ] } 如果源主机是一台远程主机,必须确保拥有以下权限: { resource: { db: "admin", collection: "system.indexes" }, actions: [ "find" ] } { resource: { db: "admin", collection: "system.namespaces" }, actions: [ "find" ] } 3)源数据库在远程主机 如果从一个拥有用户认证的远程主机复制数据库,需要一个拥有恰当的权限的用户认证。 目标数据库(todb) 1)如果目标主机数据库不是admin,必须确保拥有以下权限: { resource: { db: "myTargetDB", collection: "" }, actions: [ "insert", "createIndex" ] } { resource: { db: "myTargetDB", collection: "system.js" }, actions: [ "insert" ] } 2)如果目标主机数据库是admin,必须确保拥有以下权限: 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" ] } 示例: 192.168.11.51 mongod实例mydb库, 复制到本地newmydb库: db.copyDatabase("mydb", "newmydb", "192.168.11.52");