文章目录
MonogoDB导入导出操作分类
mongodump与mongoexport的区别:
- mongodump导出的是bson格式是二进制形式,不过可以使用mongo自带的bsondump命令查看里面的数据,而mongoexport导出的则是文本,可以是csv、json格式。
JSON可读性强但体积较大,BSON则是二进制文件,体积小但对人类几乎没有可读性。 - 在一些mongodb版本之间,BSON格式可能会随版本不同而有所不同,所以不同版本之间用mongodump/mongorestore可能不会成功,具体要看版本之间的兼容性。当无法使用BSON进行跨版本的数据迁移的时候,使用JSON格式即mongoexport/mongoimport是一个可选项。跨版本的mongodump/mongorestore个人并不推荐,实在要做请先检查文档看两个版本是否兼容(大部分时候是的)。
- JSON虽然具有较好的跨版本通用性,但其只保留了数据部分,不保留索引,账户等其他基础信息。使用时应该注意。
mongodump命令
- 从系统命令行运行mongodump,而不是mongo shell。
- mongodump仅在其备份数据中数据库中的文档,不包括索引数据。 所以mongorestore或mongod必须在恢复数据后重建索引。
- mongodump在其输出中排除本地(local数据库)数据库的内容。
以下内容翻译自 mongodb官方手册 mongodump命令
mongodump备份哪里的数据
副本集模式
当命令行参数包括副本集名字(如下所示),那么mongodump会备份replSet 中的主节点信息
--host "replSet/rep1.example.net:27017,rep2.example.net:27017,rep3.example.net:27017"
当命令行参数不包含副本集名字,那么默认备份第一个节点的数据
--host "rep1.example.net:27017,rep2.example.net:27017,rep3.example.net:27017"
分片集群模式(每个分片又是副本集)
-
对于分片群集, mongodump从群集中每个分片副本集上的主节点读取。
-
对于没有分片处理的集合,每个数据库都有一个主分片(而其他分片上没有改数据库信息),那么mongodump就会从每个数据库的主分片上的主节点上去获取数据进行备份
mongodump的命令详情
mongodump -h IP --port 端口 -u 用户名 -p 密码
--db <database>, -d <database> 需要备份的数据库
--collection <collection>, -c <collection> 需要备份的集合
--query <json>, -q <json> 筛选需要备份的数据 比如
--out <path>, -o <path> 限制备份数据的输出路径,默认在当前工作路径的dump路径上
--authenticationDatabase <dbname> 用户名认证的数据库,默认是admin数据库
--备份单个表
mongodump -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest -c d -o /backup/mongodb/myTest_d_bak_201507021701.bak
--备份单个库
mongodump -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest -o /backup/mongodb/
--备份所有库
mongodump -u superuser -p 123456 --authenticationDatabase admin --port 27017 -o /root/bak
--备份所有库推荐使用添加--oplog参数的命令,这样的备份是基于某一时间点的快照,只能用于备份全部库时才可用,单库和单表不适用:
mongodump -h 127.0.0.1 --port 27017 --oplog -o /root/bak
--同时,恢复时也要加上--oplogReplay参数,具体命令如下(下面是恢复单库的命令):
mongorestore -d swrd --oplogReplay /home/mongo/swrdbak/swrd/
-- 备份的product的集合中价格大于40元的记录 ,备份数据输出到c:\New folder\dump
mongodump --host 10.xx.xxx.xx:xxxx --db test --collection products --username abc --password uvw --query '{"price":"40"}' --authenticationDatabase test --out "c:\New folder\dump"
MongoStore命令
mongorestore程序将数据从mongodump创建的二进制数据库转储加载到mongod或mongos实例中。 从系统命令行运行mongorestore,而不是mongo shell。
--host <hostname1><:port>指定要恢复程序连接哪个mongod实例
--port <port>
--db <database>, -d <database> 需要恢复的数据库名字,如果数据库不存在,那么会创建,如果数据库已存在,会覆盖数据
--username
--password (when specifying the password as part of the URI connection string)
-authenticationDatabase <dbname> 鉴权数据库名字
--drop 在从转储的备份还原集合之前,备份文件中存在的集合会删除。 不会删除不在备份中的集合。
--恢复单个库:
mongorestore -u superuser -p 123456 --port 27017 --authenticationDatabase admin -d myTest /backup/mongodb/
--恢复所有库:
mongorestore -u superuser -p 123456 --port 27017 --authenticationDatabase admin /root/bak
--恢复单表
mongorestore -u superuser -p 123456 --authenticationDatabase admin -d myTest -c d /backup/mongodb/myTest_d_bak_201507021701.bak/myTest/d.bson
MongoImport
mongoimport工具从mongoexport创建的扩展JSON,CSV或TSV导出中导入内容,或者可能导入另一个第三方导出工具。 从系统命令行运行mongoimport,而不是mongo shell。
命令的执行要求当前用户对数据库有readWrite权限;
导入命令要求在mongos或副本集主节点上执行。
--host
--port
--db
--username
--password (when specifying the password as part of the URI connection string)
--authenticationDatabase
--db <database>, -d <database> 指定需要导入的数据库名字
--collection <collection>, -c <collection> 指定需要导入的集合名字
--fields <field1[,field2]>, -f <field1[,field2]> 通过逗号隔开,指定需要导入的字段
--file <filename> 指定需要导入的文件位置
--drop 指定该选项,则导入前删除表
--mode 导入模式(当导入数据库中有和备份文件中相同的数据时的处理方式),有insert、upsert、merge,默认insert
upsert模式,会将已有数据替换;
merge模式,会将已有数据进行合并;
在多核的环境中,通过numInsertionWorkers可指定并发运行,可提升一定效率
mongoimport --host 127.0.0.1 --port 27017 -d appdb -c T_TEST_DATA_1 -u appuser -p appuser@2016 --numInsertionWorkers 50 --file export/T_TEST_DATA.json
MongoExport
mongoexport 支持将mongodb数据表导出为json或csv格式,可在导出时指定一定的查询条件实现过滤。
命令的执行要求当前用户对数据库有read权限;
在mongos或副本集上执行时,默认采用primary readperference选项,即优先从主库上读取。
常用命令格式
mongoexport -h IP --port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 --csv
--fields <field1[,field2]>, -f <field1[,field2]> 指定需要导出的字段,以逗号隔开
--query <JSON>, -q <JSON> 导出条件
--out <file>, -o <file> 导出文件位置
--type <格式> 导出文件格式 可以是JSON ,CSV or
导出整张表
mongoexport -d tank -c users -o /home/zhangy/mongodb/tank/users.dat
导出表中部分字段
mongoexport -d tank -c users --csv -f uid,name,sex -o tank/users.csv
根据条件敢出数据
mongoexport -d tank -c users -q '{uid:{$gt:1}}' -o tank/users.json
mongoexport --host 127.0.0.1 --port 27017 -d appdb -c T_TEST_DATA -u appuser -p appuser@2016 -o export/T_TEST_DATA.json