NoteZ_技术博客 NoteZ_技术博客
🏠 首页
  • 📚 Web技术
  • 📋 Npm笔记
  • 📑 Markdown
  • 📄 Git笔记
  • 📝 Nginx文档
  • 📓 Linux文档
  • 📖 技术文档
  • 📜 其他文档
  • 🧊 NodeJs
  • 🎡 Express
  • 🔥 Rust
  • 🎉 Koa2
  • 🍃 MongoDB
  • 🐬 MySql
  • 🥦 Oracle
  • 🍁 Python
  • 🍄 JavaScript
  • 🌰 CSS
  • 🧄 HTML
  • 🥑 Canvas
  • 🌽 Nuxt
  • 🍆 React
  • 🥜 Vue
  • 🧅 TypeScript
  • 🌶️ AI
  • 📘 分类
  • 📗 标签
  • 📙 归档
⚜️ 在线编辑 (opens new window)
  • 📁 站点收藏
  • 📦 前端组件库
  • 📊 数据可视化
  • 🌈 开源插件
  • 🎗️ 关于我
  • 🔗 友情链接
GitHub (opens new window)

NoteZ_技术博客

前端界的小学生
🏠 首页
  • 📚 Web技术
  • 📋 Npm笔记
  • 📑 Markdown
  • 📄 Git笔记
  • 📝 Nginx文档
  • 📓 Linux文档
  • 📖 技术文档
  • 📜 其他文档
  • 🧊 NodeJs
  • 🎡 Express
  • 🔥 Rust
  • 🎉 Koa2
  • 🍃 MongoDB
  • 🐬 MySql
  • 🥦 Oracle
  • 🍁 Python
  • 🍄 JavaScript
  • 🌰 CSS
  • 🧄 HTML
  • 🥑 Canvas
  • 🌽 Nuxt
  • 🍆 React
  • 🥜 Vue
  • 🧅 TypeScript
  • 🌶️ AI
  • 📘 分类
  • 📗 标签
  • 📙 归档
⚜️ 在线编辑 (opens new window)
  • 📁 站点收藏
  • 📦 前端组件库
  • 📊 数据可视化
  • 🌈 开源插件
  • 🎗️ 关于我
  • 🔗 友情链接
GitHub (opens new window)
  • Express

  • Koa2

  • MongoDB

  • MySql

  • NodeJs

    • 2021 年值得使用的 Node.js 框架
    • CentOS 7上安装 Node.js 的 4 种方法
    • Linux 下安装 NodeJs 以及版本的升级和降级
    • node 中 path 模块 normalize 函数格式化路径
    • Node 中 使用 fs.stat() 读取文件状态
    • Node 中使用 compressing 压缩文件夹为 zip 文件
    • Node 中的实现 EventEmitter (event)方法
    • Node 代理 Demo 示例
    • node 判断文件或文件夹是否存在
    • node 复制文件的五种方式
    • Node 常用模块之 fs-extra
    • node 操作 mongodb 数据库备份与还原-示例代码
    • node 获取请求 ip
    • Node 读取和写入 json 文件
    • Node 递归或 mkdirp 创建多层目录
    • Node 遍历目录输出树形文件目录结构
    • Node(publish-sftp)命令上传本地文件到服务器
    • Node.js 中使用 compressing 实现zip文件的解压,解决文件名中文乱码
    • node.js 读取文件目录下的所有读取文件目录
    • Node.js把前台传来的 base64 码转成图片
    • nodeJs + vueJs 实现大文件分片上传
    • NodeJs 使用 jszip 或者 zip-dir 压缩文件夹(zip)
    • NodeJs 利用 jszip 压缩文件、文件夹,以及解压压缩文件中的文件
    • NodeJs 实现简单 WebSocket 即时通讯
    • NodeJs 框架 Express 的两种使用方式
    • NodeJs与Nginx获取客户端真实IP方法
    • NodeJs之大文件断点下载
    • NodeJS使用node-fetch下载文件并显示下载进度
    • NodeJs将图片进行压缩生成缩略图
    • nodejs递归读取所有文件
    • Node中复制文件的四种方法总结
    • node中的读取流createReadStream、写入流createWriteStream和管道流pipe
    • Node开发笔记
    • Node递归创建多层目录并写入文件
    • Node递归创建文件夹
    • PM2配置文件的使用、管理多个Node.js项目
    • 使用 koa-generator 快速搭建 Koa2 项目
    • 使用 pm2 部署 nodejs 项目
    • 使用 supervisor 自动重启 NodeJs 提高开发效率
    • 使用node反向代理解决跨域问题
    • 使用node实现保存(上传)图片的功能
    • 使用Node搭建超高压缩比的图片(webp)压缩服务
    • 前端部署从静态到node再到负载均衡
    • 在 NodeJs 中使用 compressing 压缩和解压缩文件或文件夹
    • 在 nodejs 执行 shell 指令
    • 基于 Node 生成 vue 模板文件
    • 如何使用 Nodejs 备份 MongoDB 数据
      • 核心原理
      • 代码示例
    • 如何使用NodeJs实现base64和png文件相互转换
    • 如何在 Linux 服务器上使用 Nodejs 连接远程 Oracle 数据库
    • 混淆、编译 Node.js 源代码的几种方法
    • Node.js包之archiver压缩打包文件或目录为zip格式
    • node.js获取目录内所有文件大小总和
    • NodeJs 中使用 resize-img 制作缩略图
    • nodeJS中的http模块基本介绍
    • nodejs图片处理工具gm用法
    • node使用ffmpeg将swf转mp4 截取mp4视频第一帧为jpg图片
    • 如何在Node.js中执行shell命令
    • NodeJs 中复制(拷贝)文件或文件夹的多种方式
    • 在 NodeJs 中使用 archiver 压缩超大文件夹
    • Node.js 中使用 ssh2-sftp-client 上传文件并实时获取速率大小和进度
    • Node.js 中使用 ssh2-sftp-client 上传文件到服务器示例
    • node 使用 ssh2-sftp-client 实现 FTP 的文件上传和下载功能
    • ssh2-sftp-client 上传文件夹时获取上传速度和文件夹大小
    • 基于 node 使用 UDP 上传文件示例
    • 利用Node.js监控文件变化并使用sftp上传到服务器
    • 利用 Node 监控文件夹或文件夹变化可用的 npm 包汇总
    • NodeJS获取当前目录、运行文件所在目录、运行文件的上级目录
    • Node与GLIBC_2.27不兼容解决方案
  • Oracle

  • Rust

  • Python

  • 后端开发
  • NodeJs
NoteZ
2022-05-10
目录

如何使用 Nodejs 备份 MongoDB 数据

# 核心原理

配置备份工具的基本配置,数据库配置,目录配置,命名规范 mongodump 备份数据库 文件模块按时间规范压缩 数据库文件 定时清理过期资源

# 代码示例

var path = require('path'),
	fs = require('fs-extra'),
	exec = require('child_process').exec,
	_ = require('lodash'),
	async = require('async'),
	moment = require('moment'),
	config = {
		dateFormate: 'YYYY.MM.DD',
		dbBackupPath: '/tmp/backup',
		prefix: '',
		days: 3,
		tarExt: '.tar.gz',
		tar: true
	},
	Backup = {};
/**
 * [init 数据库备份服务]
 * @param  {[type]} options [description]
 * @return {[type]}         [description]
 */
Backup.init = function (options) {
	var dbBackupPath = options.path || config.dbBackupPath, //数据库备份父级目录
		dbHost = options.host, //数据连接
		dbName = options.name, //数据库名称
		prefix = options.prefix || config.prefix, //存储目录前缀
		dateFormate = options.dateFormate || config.dateFormate, //今日备份目录名的时间标示
		todayBackUpName = getDatePath(new Date(), prefix, dateFormate), //今日备份目录名
		todayBackUpPath = path.join(dbBackupPath, todayBackUpName),
		tar = config.tar,
		tarName,
		tarPath; //今日备份目录路径
	if (!dbHost) {
		console.log('[参数缺失] dbHost');
		return;
	}
 
	if (!dbName) {
		console.log('[参数缺失] dbName');
		return;
	}
	if (!fs.existsSync(dbBackupPath)) {
		//创建数据库备份父级目录
		fs.mkdirsSync(dbBackupPath);
	}
 
	// if (fs.existsSync(todayBackUpPath)) {
	//     console.log('[已经创建] %s', todayBackUpPath);
	//     return;
	// }
	async.waterfall([
        //dump
        function (cb) {
			console.log('[开始备份] %s %s ', dbHost, dbName);
			var cmdStr = 'mongodump -h ' + dbHost + ' -d ' + dbName + ' -o ' + todayBackUpPath;
			exec(cmdStr, function (err) {
				if (!err) {
					console.log('[成功创建] %s', todayBackUpPath);
					cb(null);
				} else {
					console.log(err);
					console.log('[指令执行失败] %s', cmdStr);
					cb(err);
				}
			});
        },
        //tar
        function (cb) {
			if (tar) {
				tarName = todayBackUpName + config.tarExt;
				tarPath = path.join(dbBackupPath, tarName);
				console.log('[开始压缩] %s', todayBackUpPath);
				exec('tar -cPzf ' + tarName + ' ' + todayBackUpName, {
					cwd: dbBackupPath
				}, function (err) {
					if (!err) {
						console.log('[成功创建] %s', tarPath);
						cb(null, tarPath);
					} else {
						console.log(err);
						cb(err);
					}
				});
			} else {
				cb(null);
			}
        }
    ], function (err, result) {
		if (!err) {
			if (tar) {
				exec('rm -rf ' + todayBackUpPath, function (err) {
					if (!err) {
						console.log('[清理文件] %s', todayBackUpPath);
						console.log('------------------------------------------------------------------------------------------------------------------');
						console.log('[下载指令] %s', 'scp  <sshName>:' + tarPath + ' ' + tarName);
						console.log('------------------------------------------------------------------------------------------------------------------');
					} else {
						console.log(err);
					}
				});
 
				//清理历史数据
				var currentPaths = fs.readdirSync(dbBackupPath),
					effectPaths = getDaysInnerPath(prefix, dateFormate, options.days || config.days);
				console.log('[保留数据] %s', effectPaths[1] + '~' + effectPaths[effectPaths.length - 1]);
				for (var i = 0, len = currentPaths.length; i < len; i++) {
					if (_.indexOf(effectPaths, currentPaths[i]) < 0) {
						var rmFile = path.join(dbBackupPath, currentPaths[i]);
						exec('rm -rf ' + rmFile, function (err) {
							if (!err) {
								console.log('[清理过期文件] %s', rmFile);
							} else {
								console.log(err);
							}
						});
					}
				}
			}
		} else {
			console.log(err);
			console.log('[备份失败] %s %s', dbHost, dbName);
		}
	});
};
 
function getDatePath(date, prefix, dateFormate) {
	var dir = moment(date)
		.format(dateFormate);
	return prefix + dir;
}
 
//获取几天内的目录
function getDaysInnerPath(prefix, dateFormate, days) {
	days = days || 1;
	var now = new Date(),
		pathArray = [];
	for (var i = days - 1; i >= 0; i--) {
		var pathName = getDatePath(new Date(now.getTime() - i * 24 * 60 * 60 * 1000), prefix, dateFormate);
		pathArray.push(pathName);
		pathArray.push(pathName + config.tarExt);
	}
	return pathArray;
}
module.exports = Backup;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#NodeJs
上次更新: 2024/01/30, 00:35:17
基于 Node 生成 vue 模板文件
如何使用NodeJs实现base64和png文件相互转换

← 基于 Node 生成 vue 模板文件 如何使用NodeJs实现base64和png文件相互转换→

最近更新
01
Gitea数据备份与还原
03-10
02
Linux 中使用 rsync 同步文件目录教程
03-10
03
Linux 使用 rsync 互相传输同步文件的简单步骤
03-08
更多文章>
Theme by Vdoing | Copyright © 2019-2025 NoteZ,All rights reserved | 冀ICP备2021027292号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式