#数据库备份
mongodump -h 172.25.33.98:30000 -d test -o /opt/
注意:默认备份出来是一个文件夹,里面包含这个库相关的文件.
参数说明:
    -h:    MongDB所在服务器地址,可以指定端口号:127.0.0.1:27017
    -d:    需要备份的数据库实例,例如:test,未指定的话,备份所有的数据库,但不包含local库
        --dumpDbUsersAndRoles: 只有在 使用 --db 时才适用,备份数据库的包含的用户和角色.
    -c:    需要指定备份数据库里面的指定集合,搭配-d使用,未指定则备份指定库中的所有集合.
    -f:    备份指定集合的指定列,搭配-c使用
    -o:    备份的数据存放位置,例如:/home/mongodump/,这个目录里面存放该数据库实例的备份数据.
    -u:    数据库认证用户名,没有开认证可以不用
    -p:    数据库认证用户名对应密码
        --authenticationDatabase=<database-name>: 认证库
        --authenticationMechanism <name>: 指定认证的算法 ,默认值 SCRAM-SHA-1
    -q:    备份过程中,按条件过滤数据再导出,例如:'{x:{$gt:1}}'
        --queryFile <path>: 指定 json 文档路径,以该文档的内容作为查询条件,来备份我们过滤后的数据.
    --gzip:    默认备份出来的数据是一个文件夹,需要备份过程加压缩就要这个参数,3.2版本后可以使用,输出为文件的话会带有后缀.gz
    --repair: 尝试从损坏的数据文件中恢复文档(并非所有存储引擎都支持)
    --oplog: 使用oplog获取时间点快照,会将 mongodump 执行期间的 oplog 日志 输出到文件 oplog.bson,恢复时就比较接近实时数据,只能用于备份全部库时才可用,单库和单表不适用
    --quit: 通过抑制 MongoDB的复制,连接等活动,来实现备份,慎用.
    --archive <file>: 输出到单个存档文件或者是直接输出.
    --excludeCollection string: 排除指定的集合,如果要排除多个,使用多个--excludeCollection 
    --numParallelCollections int, -j int: 并行导出的集合数,默认为4
    --forceTableScan:    强制扫描整个表(不使用快照)force a table scan (do not use $snapshot),可用解决版本不一致导致的报错
示例:
备份所有库,推荐使用添加--oplog参数的命令,这样的备份是基于某一时间点的快照,只能用于备份全部库时才可用,单库和单表不适用:
    mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin --oplog -o /opt/bak
备份单个库
    mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d myTest -o /opt/bak
备份单个集合
    mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d myTest -c t1 -o /opt/bak
只备份集合结构(不需要数据),因为-q只能针对单个集合来过滤数据,所以需要-c指定集合操作,多个集合就要操作多次
    mongodump -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d myTest -c t1 -q '{"_id":-1}' -o /opt/bak

注意:备份出来的bson文件虽然不能直接读取,但是mongodb提供了一个可以读取的程序bsondump
    bsondump /opt/bak/oplog/local/oplog.rs.bson 
    解析出来就能进行过滤操作了
    bsondump /opt/bak/oplog/local/oplog.rs.bson | grep -B 1'"drop":"t1"'
    
#数据库恢复
mongorestore -h 172.25.33.99:30000 -d test --dir /opt/test/
参数说明:
    -h:    MongoDB所在服务器地址
    -d:    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
    -u:    数据库认证用户名,没有开认证可以不用
    -p:    数据库认证用户名对应密码
        --authenticationDatabase=<database-name>: 认证库
        --authenticationMechanism <name>: 指定认证的算法 ,默认值 SCRAM-SHA-1
    -c:    需要指定备份数据库里面的指定集合,搭配-d使用
    -q:    备份过程中,按条件过滤数据再导出,例如:'{x:{$gt:1}}'
    --dir:    备份数据所在位置,例如:/home/mongodump/itcast/
    --gzip:    从压缩文档中恢复.
    --drop:    恢复的时候,先删除当前数据,然后恢复备份的数据.就是说,恢复后,备份后添加修改的数据都会被删除,慎用!
    --dryRun:    只运行程序,不进行导入,测试备份的完成性,看有没有报错
    --oplogReplay:    重放oplog以进行时间点恢复,在备份时带--oplog可以使用
    --oplogLimit=<seconds>[:ordinal]:    仅显示时间戳之前包含oplog条目,和上面配合使用
    --oplogFile:    指定恢复时也要执行的oplog
    --quit: 通过抑制 MongoDB的复制,连接等活动,来实现备份,慎用.
    --archive <file>: 输出到单个存档文件或者是直接输出.
    --objcheck: 开启验证,验证还原操作,确保没有无效的文档插入数据库.会有较小的性能影响
    --keepIndexVersion:    阻止mongorestore在还原过程中将索引升级到最新版本.
    --restoreDbUsersAndRoles: 还原指定的数据库用户和角色.
    --maintainInsertionOrder: 默认值为False,如果为 True,mongorestore 将按照输入源的文档顺序插入,否则是 随机执行插入.
    --numParallelCollections int, -j int: 指定并行恢复的集合数,如果集合太多,数据量也多,建议设置1-5,虽然速度会变慢,但是会对服务器压力比较友好.
    --numInsertionWorkersPerCollection int: 默认值为 1,指定每个集合恢复的并发数,大数据量导入增加该值可提高恢复速度,但是也要看服务器压力能不能支撑.
    --writeConcern='{w:3, wtimeout: 500, fsync: true, j: true}':    写安全选项,按需求选择,对于数据一致性要求较高,建议设定为{w:2,j:true}以上.
示例:
恢复所有库,如果有指定oplog,需要添加--oplogReplay
    mongorestore -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin --oplogReplay --dir /opt/bak
恢复单个库
    mongorestore -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d myTest --dir /opt/bak
恢复单表,需指定到指定的bson文档
    mongorestore -h 127.0.0.1 --port 27017 -u root -p 123456 --authenticationDatabase admin -d myTest -c t1 --dir /opt/bak/myTest/t1.bson
从放指定时间戳之前的oplog数据
    mongorestore --port 2203 --oplogReplay --oplogLimit=1496665069:1 /tmp/restore

#数据导出工具
和备份有点不一样,一定要指定集合才能导出,不能全库,但是支持导出JSON格式或CSV格式的文件,可用于异构数据库导入
mongoexport -h 10.21.128.108 --port 27017 --authenticationDatabase=admin  -d config  -c collections -u root -p "***" -o /opt/t.txt --type json/csv -f field
参数说明:
    -h:    MongoDB所在服务器地址
    -d:    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
    -u:    数据库认证用户名,没有开认证可以不用
    -p:    数据库认证用户名对应密码
        --authenticationDatabase=<database-name>: 认证库
        --authenticationMechanism <name>: 指定认证的算法 ,默认值 SCRAM-SHA-1
    -d:    数据库名
    -c:    collection集合名
    -o:    输出的文件名
    --type:    输出的格式,默认为json
    -f:    输出的字段,如果-type为csv,则需要加上-f "字段名"    
    -q, --query:代表查询条件
    --skip:跳过指定数量的数据;
    --limit:读取指定数量的数据记录;
    --sort:对数据进行排序,可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列,如sort({KEY:1}).
    -k, --slaveOk: 允许能读从库
示例:    
导出一个表的数据,按照特定字段排序显示,并导出成csv格式,如字段结果是数组或列表等,需要特别标注,如下例子innName.0代表innName下的0的结果,-f的字段顺序是可以变的.-q的条件要注意外层还有个引号
    mongoexport -h 127.0.0.1 --port 30000 --authenticationDatabase=admin -u root -p '****' -d n_search -c N_INFO2 -f _id,innId,status,innName.0 -q '{"weHotelCode":"1000060"}' -o /opt/t.csv --type csv 
特例1:
当遇到超级复杂的查询条件或者是聚合函数aggregate等的过滤条件时,mongoexport支持不好,我们要换一种思路,先把它导出成一个新的集合,再导出来.
    把聚合函数aggregate结果先导出到文件,由条件{$out:"20171114_tmp"}完成,20171114_tmp是临时集合的名称,这个功能在2.6版本就支持了.
        db.collection.aggregate([{aggregation steps...},{$out:"20171114_tmp"}])
    又或者把结果赋值给一个变量,然后再插入到一个新集合,这个操作通用性较高,不是聚合函数也可以用,要注意标点符号格式,很容易因为格式不对而报错,这个操作会生成一个游标,循环导出文档再插入的目的集合.    
        #先把查询语句赋值到一个游标变量
        var result=db.collection.aggregate([{aggregation steps...}])
        #然后通过while循环把游标值插入到新建表中(下面的写法并没有错,就是要空格隔开)
        while(result.hasNext()) db.新建表名.insert(result.next())
    最后,只要把这个临时集合整个导出来,就完事了
        mongoexport -h * --port=40001 -u * -p "*" --authenticationDatabase=admin -d test -c 20171114_tmp -f _id,count,signInDate,bizInfo.sid,bizInfo.innName,days --type=csv --out=/opt/20191114.csv
        注意:某些字段会存在嵌套,如例子中的bizInfo字段,嵌套了sid,innName子字段,需要独立标示出来,不然在csv中可能体现不出来.
    当然,记得把临时集合删了
        db.getCollection("20171114_tmp").drop()

#数据导入工具
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv -f field
参数说明:
    -h:    MongoDB所在服务器地址
    -d:    需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2
    -u:    数据库认证用户名,没有开认证可以不用
    -p:    数据库认证用户名对应密码
        --authenticationDatabase=<database-name>: 认证库
        --authenticationMechanism <name>: 指定认证的算法 ,默认值 SCRAM-SHA-1
    -d:    数据库名
    -c:    collection集合名
    --type:    导入的格式默认json
    -f:    导入的字段名
    --headerline:    如果导入的格式是csv,则可以使用第一行的标题作为导入的字段
    --file:    要导入的文件
    --headerline:导入csv文件时,指明第一行是列名,不需要导入