#数据库备份
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文件时,指明第一行是列名,不需要导入