mongodb_导入导出数据

Mongodb 导入导出数据

在mongodb中多中导入导出数据的方式,需要针对不同的应用进行选择。本文主要讲mongoexport,import及dump,restore这两种方式

1.mongoexport,mongoimport

这是一种导成json格式的方式。Json可以导入多种数据库,也可以在mongodb的不同版本之间进行操作
mongoexport 可以导成json及csv格式,但是csv格式必须使用-f 来表明需要导出的字段,如果是一个比较大的集合,那么需要指明每一个字段,针对这点,json还是比较方便,不过csv格式可以直接导入SQLServe.在mongodb中导出含有中文的字符可能会出现乱码,如果文档不是很大,可以使用txt然后指定编码格式另存为新的一份csv会破解这种乱码的情况。
Mongoexport -d test -c name -o name.dat -h 127.0.0.1:5000 –u xxx –p xxx –authenticationDatabase=admin
其中dat的格式是数据库将自己格式的数据文件转换成文本格式,dat是其中一种纯文本的,没有任何数据属性结构方面的信息,可以使用记事本打开。

2. mongodump,mongorstore

导出包括.metadata,.bson两个文件,包含索引等信息,应该说相对是比较完整的信息。但是很可能在不同版本之间导入导出会出现问题。Mongodump备份的例子为:
mongodump -h 127.0.0.1:5000 -u xxx -p xxx –authenticationDatabase=admin -d test -c name -o /home/dump
其中:h:ip与端口,u:用户名,-p 密码,–authenticationDatabase授权数据库,d 需要备份的数据库名称,-c 备份的集合,-o 备份的目录。所以这就相当于可以将远程的数据库备份到本地。只要指定了对应的ip及端口号。
Mongorestore –h 127.0.0.1:5000 -u xxx -p xxx –authenticationDatabase=admin -d test -c name /home/dump/test/name.json
在还原数据库的时候,不需要写出-o选项。最后一个参数默认为数据的路径,我们需要写明哪个json. 如果没有-c指定集合,默认的是整个数据库。对应的在mongorstore中不需要指定某个特定的集合,但必须指定数据库备份的目录。

问题集锦
1.在Mongoexport及mongodump中均可以使用-q来指定需要备份还原的符合条件的结果集。需要注意的是如果使用了ISODate类型的字段作为查找,-q后面的查询不能直接写成ISODate(“2017-02-12T08:00:00Z”),需要转换成时间戳格式。并使用Date时间进行查询。在shell中使用ISODate(“2017-02-12T08:00:00Z”).valueOf()得到数值。所以,查询条件应为:new Date(1486886400000)
2.今天在备份数据的时候很长一段时间都是%0的进度,当然这个集合有一点大,数据量上亿。好容易到了121条数据,突然报错:error reading collection: invalid cursor。
原因:mongodb的备份数据可能会出现问题,来自于游标。网址为:https://jira.mongodb.org/browse/TOOLS-902,于是按照所述的方案:db.runCommand({setParameter: 1, cursorTimeoutMillis: 60000}),再次执行dump果然是生效了。
3.Mongorestore在导入数据是遇到:invalid BSONSize使用—batchSize=1000来解决
连接为: https://jira.mongodb.org/browse/TOOLS-939
4.在mongodb写入数据库时会使用压缩算法,但是使用dump之后将会还原到原始大小,所以在备份前应该查看的是size大小而不是storageSize大小来权衡硬盘的容量

还有几种其它的数据库复制策略
3. db.cloneCollection
存在的问题有:1.不支持授权的原数据库;2.如果集合已经存在则会报错;3.只能从mongod中进行复制,不支持mongos.所以如果是分片的情况下,是不适合使用该方式。
4. db.cloneDatabase
在3.2版本中,克隆整个数据库,会将目标数据库锁住,如果当前数据库正在使用,无疑非常的危险。
5. db. collection.CopyTo
是一个全局锁,阻止所有的读写操作。需要anyAction,anyResource权限,使用的是js命令。
6. db.copyDatabase
目标数据库不能存在相同的集合,mongod之间的操作,在分片的情况下,不可使用copyDatabase

总结:所以如果是希望从一个数据库中还原数据至另一个数据库,且数据库还原过程必须不能影响现有的操作,使用dump与restore相对来说是比较好的方式。

猜你喜欢

转载自blog.csdn.net/tang_jin2015/article/details/54999766