mongodb备份和导出csv
mongodb备份方式有三种
- 文件快照方式
- 复制数据文件方式
- 使用mongodump方式
oplog以及副本集,集群等备份,还是推荐用mongodump
原理
mongodb的简单备份一般使用mongoexport即可,只要你装了mongodb就有的命令,上面说的其他方式适合dba,而非程序员
基本用法
mongoexport -d xxx-db -c activities -o activities.csv
说明
- -d 指明数据库是哪个
- -c 说明collection名字
- -o 是输出的文件名称
其实还有jsonArray
,query
等其他高级用法,尽在
mongoexport --help
帮助文档里。
全库备份
之前的做法是写一个shell脚本,把上面的每一个collection拷贝一行,然后crontab定时去执行
如果collection太多呢?真是又臭又长。。。
如果再加个日志,如果再xxx
那感觉才叫一个刺激。。。
以上是我写mmb的动机
现在说说我的解决方案,即mmb
mmb是神马?
mmb是moa mongodb backup,很直白的说它是备份mongodb数据的。
readme里我是这样写的
mmb = moa mongodb backup, backup data to a dirname that generated by momentjs's date format
它可以根据配置项里的dirname选项,按照时间去生成目录,也就是说我想按照天去备份,就写成
"dirname":"YYYY-MM-DD"
我想按照秒备份
"dirname":"YYYY-MM-DD HH:mm:ss"
特性
- 支持linux和mac(严格的说,支持shell的都可以)
- 纯nodejs写的模块,提供cli,可以简单实用
- 支持配置文件
- 支持多个实例
- 支持crontab,使用简单
Install
[sudo] npm install -g mmb
Usages
第一步初始化一个配置文件,执行
mmb init
此时,用任何编辑器打开mongo.config.json
,按需要修改里面的配置文件即可,然后就可以备份数据了:
mmb
会读取当前目录下的mongo.config.json
文件,根据文件内的配置信息,备份全部数据到指定目录。
配置文件说明
当执行 mmb init
, 会创建mongo.config.json文件,它就是mmb的配置文件
mongodb服务器配置项
- “host”: 127.0.0.1
- “port”: 27017
- “db”: database name
备份数据目录名称配置项
- “dirname”: dirname that generated by momentjs’s date format, see http://momentjs.com/docs/#/parsing/string-format/
说明:
"dirname":"YYYY-MM-DD HH:mm:ss"
这样的format里有空格无法生成目录名,所以空格会替换为_
与crontab集成:以每分钟为例
如果不了解crontab,请移步https://www.baidu.com/s?wd=crontab&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=3&rsv_sug1=3
第一步:初始化
mmb init
第二步:修改配置文件,假定我的mongodb信息不变,我需要修改dirname,按分钟生成,具体如下:
{
"host": "127.0.0.1",
"port": "27017",
"db": "xbm-wechat-api",
"dirname":"YYYY-MM-DD HH:mm"
}
第三步:测试
mmb
看看,生成的目录是否正常,以及目录里的数据是否正常
➜ mongodbbackup date
Sun Aug 23 22:42:14 CST 2015
➜ mongodbbackup mmb
➜ mongodbbackup ls
2015-08-23_22:42 2015-08-23_22:42.log export.sh mongo.config.json
这样就代表是正确的。
第四步:集成crontab,写一个脚本cron.sh
➜ mongodbbackup cat cron.sh
#!/bin/bash
cd /Users/sang/test/mongodbbackup
mmb
然后,给cron.sh增加执行权限
chmod +x cron.sh
配置crontab,定时执行cron.sh
➜ mongodbbackup touch cron-mmb.conf
填写以下内容
* * * * * sh /Users/sang/test/mongodbbackup/cron.sh
保存即可。
➜ mongodbbackup sudo crontab -u root cron-mmb.conf
这样每分钟都会执行cron.sh,即每分钟备份一次了
五个星星表示
- minute — 分钟,从 0 到 59 之间的任何整数
- hour — 小时,从 0 到 23 之间的任何整数
- day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)
- month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)
- dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)
crontab简单用法说明
- crontab -l显示目前所有的任务
- crontab -r删除所有的任务
- crontab -e编辑任务
导出csv
照理说mongoexport是支持导出csv,但是那个东西基本不能看,不是人读的
那么有没有更好一点的做法呢?
以jsonArray导出
➜ mongodbbackup mongoexport -d xbm-wechat-api -c senddeliveryhistories -o senddeliveryhistories.json --jsonArray --query "{'user_to_name' : 'ywiwfi'}"
2015-08-23T23:12:45.668+0800 connected to: localhost
2015-08-23T23:12:45.670+0800 exported 1 record
➜ mongodbbackup cat senddeliveryhistories.json
[{"__v":0,"_id":{"$oid":"55bf208846b246fa238ff4d7"},"created_at":{"$date":"2015-08-03T08:04:24.648Z"},"date":"20150803","delivery_number":"","express":{"$oid":"5559a7edcb20cb272f412d96"},"express_company":"sfjowj","express_remark":"wifyiwfi","items":[],"last_modified_at":{"$date":"2015-08-03T08:04:24.648Z"},"last_modified_user":"","remark":"jjjj","status":2,"user_from_address":"kjwiji","user_from_id":{"$oid":"5559944fa56f3f192e22d2d4"},"user_from_mobile":"ijfij","user_from_name":"lwlfl","user_to_address":"uwyfuwi","user_to_id":{"$oid":"555993e7c3ab570c2eb23687"},"user_to_mobile":"uyfowhohi","user_to_name":"ywiwfi"}]
启动j2csv
把拷贝json文件里的内容,放到文本框里
➜ mongodbbackup j2csv
more
如果你有更好的办法请不吝赐教 shiren1118@126.com
全文完
欢迎关注我的公众号【node全栈】
已试用,赞~
更新
- mmb v1.1.0 版本支持了mmi命令,可以将数据导回数据库中
另外,j2csv受限于浏览器,只能处理3000条以内的数据,所以写了ej
如果 mongodb有密码呢?
mongoexport --help
Usage:
mongoexport <options>
Export data from MongoDB in CSV or JSON format.
See http://docs.mongodb.org/manual/reference/program/mongoexport/ for more information.
general options:
--help print usage
--version print the tool version and exit
verbosity options:
-v, --verbose more detailed log output (include multiple times for more verbosity, e.g. -vvvvv)
--quiet hide all log output
connection options:
-h, --host= mongodb host to connect to (setname/host1,host2 for replica sets)
--port= server port (can also use --host hostname:port)
authentication options:
-u, --username= username for authentication
-p, --password= password for authentication
--authenticationDatabase= database that holds the user's credentials
--authenticationMechanism= authentication mechanism to use
namespace options:
-d, --db= database to use
-c, --collection= collection to use
output options:
-f, --fields= comma separated list of field names (required for exporting CSV) e.g. -f "name,age"
--fieldFile= file with field names - 1 per line
--type= the output format, either json or csv (defaults to 'json')
-o, --out= output file; if not specified, stdout is used
--jsonArray output to a JSON array rather than one object per line
--pretty output JSON formatted to be human-readable
querying options:
-q, --query= query filter, as a JSON string, e.g., '{x:{$gt:1}}'
-k, --slaveOk allow secondary reads if available (default true)
--forceTableScan force a table scan (do not use $snapshot)
--skip= number of documents to skip
--limit= limit the number of documents to export
--sort= sort order, as a JSON string, e.g. '{x:1}'
看authentication option部分
目前确实还没有,稍后加上
@i5ting 感谢!期待你稍后加上!这个工具最爽的地方就是定时备份,用最简单的方式去使用
请问代码里的export.sh文件 项目代码怎么没有?
这个报错百思不得其解,求救 原来多了一个星星
sh cron.sh能运行结果,但在crontab自动执行的时候,在12点20 没有执行出结果
20 12 * * * sh /root/mongodbbackup/cron.sh
/bin/sh:1:root :not found报错这个 From Noder
因为环境变量问题 手动可以 系统自动就不行 提示command not found,暂时没办法了,希望后面有人实践出来留言一下 我把问题都记在这里了。