当前位置: 首页 > 后端技术 > Node.js

通过Node.js实现MongoDB数据库复制传输

时间:2023-04-03 19:47:38 Node.js

我需要将原来的MongoDB数据完整的复制到新的服务器上。查了下,实现方式还是挺多的,不过我觉得还是写个node脚本比较好,实现自由方便。这个方法应该也没有跨版本不兼容的坑,至少我是从3.4升级到4.2的。该脚本依赖于mongodb。我需要保证node.js版本支持直接运行async+awaitmongodb-copy.jsconst{MongoClient}=require('mongodb');//源库地址constbaseUrl='mongodb://asseek:123456@xxx.xxx.xxx.xxx:27017/i_mall?authSource=admin';//目标库地址我启用了安全并更改consttargetUrl='mongodb://asseek:123456@127.0.0.1:27017/i_mall?authSource=admin';//要复制的库名constdbName='i_mall';//要复制的表名为空复制所有表constcollections=[];//要排除的表名constexcludeCollections=[];//复制前是否删除目标数据库数据?如果保证不会出现主键重复,可以关闭constdropTarget=true;//数据分片的大小防止表过大占用内存constsharding=10000;(async()=>{console.time('mongodb-copy');让collectionLength=0,insertLength=0,dropLength=0;try{constbaseClient=awaitMongoClient.connect(baseUrl,{useUnifiedTopology:true});constbaseDb=awaitbaseClient.db(dbName);consttargetClient=awaitMongoClient.connect(targetUrl,{useUnifiedTopology:true});consttargetDb=awaittargetClient.db(dbName);尝试{constbaseCollections=awaitbaseDb.collections();for(constbaseCollectionofbaseCollections){constname=baseCollection.collectionName;如果(collections.length&&!collections.includes(name))继续;如果(excludeCollections.includes(name))继续;consttargetCollection=targetDb.collection(名称);让count=awaitbaseCollection.find().count();让drop=0,insert=0,_id='';if(dropTarget){const{result:{n}}=awaittargetCollection.deleteMany();dropLength+=n;下降=n;}while(count>0){constsearch=_id?{_id:{$gt:_id}}:{};constbaseResults=awaitbaseCollection.find(search).limit(sharding).toArray();if(baseResults.length){const{result:{n}}=awaittargetCollection.insertMany(baseResults);插入长度+=n;插入+=n;_id=baseResults[baseResults.length-1]._id;}计数-=分片;}collectionLength+=1;console.log(`[${name}][删除${drop}][插入${insert}]`);}baseClient.close();targetClient.close();}catch(e){console.error('错误',e);baseClient.close();targetClient.close();}}catch(e){console.error('连接问题',e);}console.log(`mongodb-copy:[复制集合${collectionLength}][删除${dropLength}][插入${insertLength}]`);console.timeEnd('mongodb-copy');})();直接console执行文件nodemongodb-copy.js拖远程库瓶颈基本在数据传输上,20010000条数据把所有数据库都复制下来,测试用了26分钟。在本地复制一个200万条数据的数据库,耗时1分39秒。