通过Node.js实现MongoDB的数据库复制转移基础教程_MongoDB攻略教程

我需要把原来的 MongoDB 数据完整拷贝到新服务器上,查了一下实现方式蛮多的,但我觉得都不如写个 node 脚本来实现自由方便,这个方式也应该没有跨版本不兼容的坑,至少我从3.4升级到4.2是没问题的
脚本依赖 mongodb, 需确保 node.js 版本支持直接运行 async + await
mongodb-copy.jsconst {MongoC

通过Node.js实现MongoDB的数据库复制转移基础教程

我需要把原来的 MongoDB 数据完整拷贝到新服务器上,查了一下实现方式蛮多的,但我觉得都不如写个 node 脚本来实现自由方便,这个方式也应该没有跨版本不兼容的坑,至少我从3.4升级到4.2是没问题的
脚本依赖 mongodb, 需确保 node.js 版本支持直接运行 async + await
mongodb-copy.js

通过Node.js实现MongoDB的数据库复制转移基础教程_MongoDB攻略教程

const {MongoClient} = require('mongodb');

// 源库地址
const baseUrl = 'mongodb://asseek:123456@xxx.xxx.xxx.xxx:27017/i_mall?authSource=admin';

//目标库地址 我这是开启了security视自己情况改
const targetUrl = 'mongodb://asseek:123456@127.0.0.1:27017/i_mall?authSource=admin';

// 要复制的库名
const dbName = 'i_mall';

// 要复制的表名 为空复制所有表
const collections = [];

// 要排除的表名
const excludeCollections = [];

// 拷贝前是否先删除目标库数据 如果确保不会出现主键重复可关闭
const dropTarget = true;

//数据分片大小 避免表太大占爆内存
const sharding = 10000;

(async () => {
  console.time('mongodb-copy');
  let collectionLength = 0, insertLength = 0, dropLength = 0;
  try {
    const baseClient = await MongoClient.connect(baseUrl, {useUnifiedTopology: true});
    const baseDb = await baseClient.db(dbName);

    const targetClient = await MongoClient.connect(targetUrl, {useUnifiedTopology: true});
    const targetDb = await targetClient.db(dbName);
    try {
      const baseCollections = await baseDb.collections();
      for (const baseCollection of baseCollections) {
        const name = baseCollection.collectionName;
        if (collections.length && !collections.includes(name)) continue;
        if (excludeCollections.includes(name)) continue;
        const targetCollection = targetDb.collection(name);
        let count = await baseCollection.find().count();
        let drop = 0, insert = 0, _id = '';
        if (dropTarget) {
          const {result: {n}} = await targetCollection.deleteMany();
          dropLength += n;
          drop = n;
        }
        while (count > 0) {
          const search = _id ? {_id: {$gt: _id}} : {};
          const baseResults = await baseCollection.find(search).limit(sharding).toArray();
          if (baseResults.length) {
            const {result: {n}} = await targetCollection.insertMany(baseResults);
            insertLength += n;
            insert += n;
            _id = baseResults[baseResults.length - 1]._id;
          }
          count -= sharding;
        }
        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');
})();

直接控制台执行文件

node mongodb-copy.js

拖远程库瓶颈基本都在数据传输上,200万条数据的库全部复制过来花了26分钟
通过Node.js实现MongoDB的数据库复制转移基础教程_MongoDB攻略教程
测试了一下本地拷贝个200万数据的库1分39秒
通过Node.js实现MongoDB的数据库复制转移基础教程_MongoDB攻略教程

海计划公众号
(0)
上一篇 2020/03/22 08:48
下一篇 2020/03/22 08:48

您可能感兴趣的内容

  • WePY入门攻略_一款让小程序支持组件化开发的框架

    WePY入门攻略 官方网址:https://tencent.github.io/wepy/ GitHub:https://github.com/Tencent/wepy 简介描述:…

    2020/03/06
  • 谷歌准备放弃存在 9 年的 XSS 检测工具零基础入门_工具小白入门

    谷歌正在移除其 Chrome 网络浏览器中已经存在 9 年的一个功能,该功能可以帮助避免一些潜在的在线攻击。不过,别担心——优化的保护方案也即将出台。XSS AuditorXSS Auditor 是 2010 年推出的一个内置 Chrome 函数,用于检测跨站点脚本 (XSS) 漏洞。在 XSS 攻击中,恶意行为者将自己的代码注入合法网站。他们可以通过在合法

    2020/03/26
  • npm view命令新手入门_npm菜鸟教程下载

    npm view功能查看注册表信息npm view使用npm view [/][@] [[.]…]
    aliases: info, show, vnpm view说明此命令显示有关程序包的数据,并将其打印到outfd配置引用的流中,默认情况下为stdout。要显示包的包注册表项

    2020/03/24
  • 移动端300ms延迟的解决方法入门指南_移动端使用帮助

    一般情况下,如果没有经过特殊处理,移动端浏览器在派发点击事件的时候,通常会出现300ms左右的延迟。也就是说,当我们点击页面的时候移动端浏览器并不是立即作出反应,而是会等上一小会儿才会出现点击的效果。在移动WEB兴起的初期,用户对300ms的延迟感觉不明显。但是,随着用户对交互体验的要求越来越高,现今,移动端300ms的点击延迟逐渐变得明显而无法忍受。那么,

    2020/04/05
  • css transition 实现滑入滑出菜鸟教程网_动画攻略教程

    transition是css最简单的动画。 通常当一个div属性变化时,我们会立即看的变化,从旧样式到新样式是一瞬间的,嗖嗖嗖!!!但是,如果我希望是慢慢的从一种状态,转变成另外一种状态,怎么办? transition可以做到。第一问:哪些属性值变化会触发这个transition呢? 一般常见的有:width, height, opacity, color

    2020/04/03
  • vue项目中的菜单权限控制小白基础_菜单入门教程

    在pc 管理系统这种类型的产品,通常会涉及到账号权限的控制,不同的账号权限能浏览的功能模块是不同的,对应侧边栏菜单模块的显示也会不同。场景一、(电商类管理系统)登录登录后,依次获取账号 tokenId、店铺列表、默认店铺ID、菜单列表通过菜单列表生成侧边栏,注意router 文件里面定义了全部的页面路由,所以配置新菜单时候需要提供给后端前端定义的页面路径me

    2020/03/29
  • history对象详解及单页面路由实现使用帮助_对象菜鸟教程

    history对象保存着用户的上网记录,从浏览器窗口打开的那一刻算起。出于安全的考虑,开发人员无法得知用户浏览过的URL。不过,借由用户访问过的页面列表,同样可以在不知道实际URL的情况下实现后退与前进 一、history对象的方法go(Stirng|number)使用go方法可以在用户的历史记录中任意跳转,可以向后也可以向前。这个方法接受一个参数,表示向

    2020/03/31
  • Mac谷歌(chrome)浏览器快捷键入门攻略_快捷键基础指南

    1. 标签页和窗口快捷键⌘-N打开新窗口。⌘-T打开新标签页。⌘-Shift-N在隐身模式下打开新窗口。按 ⌘-O,然后选择文件。在 Chrome 浏览器中打开计算机中的文件。按住 ⌘ 的同时点击链接。或用鼠标中键(或鼠标滚轮)点击链接。从后台在新标签页中打开链接。按住 ⌘-Shift 的同时点击链接。或按住 Shift 键的同时用鼠标中键(或鼠标滚轮)点击

    2020/03/29
  • 关于 Promise 的 9 个提示指南教程_Promise小白知识

    1. 你可以在 .then 里面 return 一个 Promise让我来说明这最重要的一点是的!你可以在 .then 里面 return 一个 Promise而且,return 的这个 Promise 将在下一个 .then 中自动解析。.then(r => {return serverStatusPromise(r); // 返回 { statusCod

    2020/03/31
  • 前端:经典的递归面试题入门知识_面试小白基础

    细胞分裂细胞分裂 有一个细胞 每一个小时分裂一次,一次分裂一个子细胞,第三个小时后会死亡。那么n个小时候有多少细胞?
    这个问题的核心就是三个小时为一个周期// 每三个小时为一个周期 , 第四个小时就 go die 了。
    // 方法一
    // 第一个小时,只有a态细胞;第二个小时,a态细胞分裂,原来的a态细胞变成了b态细胞,分裂出来的细胞变成了新的a态细胞;第三

    2020/04/03
  • 最好的JavaScript数据可视化库菜鸟攻略_可视化使用说明

    在 JS 程序中,为了实现漂亮的图形、图表和数据可视化,我们选择使用开源库。生活在数据爆炸的时代,我们开发的每一个应用程序几乎都使用或者借助数据来提升用户体验。为了帮助你轻松地为你最喜欢的应用程序添加漂亮的数据可视化,这里列出了 2019 年最好的 JavaScript 数据可视化库(排名不分先后)。1. D3jsstar 数:88KD3.js 可能是最流行

    2020/03/23
  • Flutter异步加载:Future,async/await菜鸟攻略_加载小白指南

    概念Future对象表示异步操作的结果,我们通常通过then()来处理返回的结果async用于标明函数是一个异步函数,其返回值类型是Future对象await用来等待耗时操作的返回结果,这个操作会阻塞到后面的代码三种方式async/awaitFutureFutureBuilderasync/await被async修饰的函数,会返回一个Futured对象

    2020/03/29
  • webpack 加载动态图片基础指南_图片入门基础教程

    webpack 加载动态图片所谓动态图片指的是接口返回的图片地址,这里的地址指的是本地的图片地址,而非网络图片的url。本地有一个 image 文件夹,存放需要用到的图片。按照接口返回的图片地址比对去加载。webpack加载图片首先想到的是 file-loader 或者 url-loader 加载图片的配置首先安装file-loader npm inst

    2020/03/23
  • React setState 这样用,开发直呼内行!小白指南_react使用帮助

    众所周知, React 是通过管理状态来实现对组件的管理,而setState是用于改变状态的最基本的一个方法,虽然基础,但是其实并不容易掌握,本文将结合部分源码对这个方法做一个相对深入的解析。基本用法首先官方文档给出的,它的基本API:// 接受2个参数,updater 和 callback
    setState(updater[, callback])// 第

    2020/03/22
  • Node.js之删除文件夹(含递归删除)小白攻略_文件基础教程

    应用场景:比如像Eclipse这样的IDE,右击项目,出现选项,点击选项中的删除,就可以删除这个项目及其下的子目录包含文件(使用electron开发的桌面端项目多少都会用到)。核心代码如下: function deleteFolderRecursive(url) {var files = [];/*** 判断给定的路径是否存在*/if (fs.exists

    2020/03/29
  • 近乎SpaceBuilder小白攻略_基于asp.net mvc最强大的SNS社区软件

    近乎SpaceBuilder入门基础知识 官方网址:http://www.jinhusns.com/ 简介描述:基于asp.net mvc最强大的SNS社区软件 近乎(Spaceb…

    2020/03/06