mongodb的数据转储除了使用compass图形界面导出导入json或csv文件这种方式,还有命令行方式(效率比较高且可压缩,对于远程传输mongo数据hin友好),即今天介绍的mongodump和mongorestore。
我们的需求是先用dump导出数据(指定的数据库或者集合),导出的数据是个以数据库名命名的文件夹,里面是集合数据,每个集合对应两个文件,.bson和.metadata.json。使用压缩命令可以将.bson等文件压缩。
然后使用restore命令将该文件中包含的集合信息导入到指定数据库。
以下是两个命令的例子和参数介绍:
Mongodump
(使用前提是安装mongodb database tools,将其生成的各种exe文件复制到mongodb的bin目录中,同时bin要加入系统变量中以免在cmd运行时出错)
常用命令分析
mongodump -h localhost -d hosp_aixin -c details -o G:\000
mongodump --gzip -h localhost -d hosp_aixin -c details -o G:\000
-h:
MongoDB 所在服务器地址,例如:127.0.0.1(localhost),当然也可以指定端口号:127.0.0.1:27017
-d:
需要备份的数据库实例,例如:hosp_aixin
-c:
需要精确到集合(collection),例如:details
-o:
备份的数据存放位置,例如:G:\000,当然该目录需要提前建立.
--gzip:
将文件压缩为.gz压缩文件,省空间。
-h, --host=<hostname> MongoDB服务器的地址,默认为localhost
-p, --port=<port> MongoDB服务器的端口号,默认为27017
-d, --db=<database> 需要备份的数据库名称
-c, --collection=<collection> 需要备份的集合名称,不指定时默认备份全库
-u, --username=<username> 登录MongoDB服务器的用户名
--password=<password> 登录MongoDB服务器的密码
-o, --out=<directory> 备份数据的目录路径
-q, --query=<query> 指定查询条件
--ssl 使用SSL连接到MongoDB服务器
--sslCAFile=<filename> SSL CA证书文件路径
--sslPEMKeyFile=<filename> SSL PEM证书文件路径
--sslPEMKeyPassword=<password> SSL PEM证书密码
--authenticationDatabase=<database> 认证数据库的名称
--gzip 备份数据时使用gzip进行压缩
--archive=<filename> 将备份数据保存到归档文件中
--quiet 禁止输出日志信息
Mongorestore
如果是将dump好的集合导入到指定数据库,不用指定数据库下的集合名,也不用创建集合。
mongorestore --db xiaoshanyiyuan G:\000\hosp_aixin
mongorestore --gzip --db xiaoshanyiyuan G:\000\hosp_aixin\test
-h, --host=<hostname> MongoDB服务器的地址,默认为localhost
-p, --port=<port> MongoDB服务器的端口号,默认为27017
-d, --db=<database> 恢复数据的数据库名称
-c, --collection=<collection> 恢复数据的集合名称
-u, --username=<username> 登录MongoDB服务器的用户名
--password=<password> 登录MongoDB服务器的密码
-o, --out=<directory> 恢复数据的目录路径
--drop 在恢复数据前删除已存在的集合
--ssl 使用SSL连接到MongoDB服务器
--sslCAFile=<filename> SSL CA证书文件路径
--sslPEMKeyFile=<filename> SSL PEM证书文件路径
--sslPEMKeyPassword=<password> SSL PEM证书密码
--authenticationDatabase=<database> 认证数据库的名称
--gzip 恢复数据时使用gzip进行解压缩
--quiet 禁止输出日志信息
实践记录:(有点坑)
使用dump工具参考以上教程,在winserver上成功导出了details库的数据,但是比较大,压缩包11个G,想尝试使用query参数按照集合中的时间字段进行限制,比如update_day,但是一直报错(后续有时间可以继续研究)。
将压缩包拷至centos,直接使用上面restore命令报错,于是mongorestore --help查看官方文档,喂给大模型,说清自己的需求,让他帮生成命令,最后根据后台报错信息,一步步调试,最终运行成功(太折磨人了,都想放弃了)
最后给出mongo6.0.2版本的restore命令,仅供参考,实际场景还是得研究官方文档!
mongorestore --uri="mongodb://172.168.10.171/zhedaeryuan" --gzip --dir=/u01/workspace/gzh/details/zhedaeryuan
最后,尝试用compass直接进行数据的导出,csv文件28G,压缩后只有1.7G!!,所以如果对存储空间有要求,就不要用mongodump,相比其压缩后的11G,compass直接导出后再压缩还是小的多的。但是导出时间没太留意对比,感觉并不比mongodump慢很多。