MongoDB 教程六: MongoDB管理:数据导入导出,数据备份恢复及用户安全与认证

(视频来源:php兄弟连)

MongoDB 系列教程索引 : MongoDB 教程索引 (附有视频)

 

MongoDB数据库备份与恢复

一、备份

先介绍下命令语法:

mongodumph dbhost –d dbname –o dbdirectory

-h:MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

-d:需要备份的数据库实例,例如:test

-o:备份的数据存放位置,例如:/data0/backup,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据。

mongodump -h IP –port 端口 -u 用户名 -p 密码 -d 数据库 -o 文件存在路径

如果没有用户谁,可以去掉-u和-p。
如果导出本机的数据库,可以去掉-h。
如果是默认端口,可以去掉–port。
如果想导出所有数据库,可以去掉-d。

实例一:导出所有数据库

[root@localhost mongodb]# mongodump -h 127.0.0.1 -o /home/ikeepstudying/mongodb/  
connected to: 127.0.0.1  
Tue Dec  3 06:15:55.448 all dbs  
Tue Dec  3 06:15:55.449 DATABASE: test     to     /home/ikeepstudying/mongodb/test  
Tue Dec  3 06:15:55.449     test.system.indexes to /home/ikeepstudying/mongodb/test/system.indexes.bson  
Tue Dec  3 06:15:55.450          1 objects  
Tue Dec  3 06:15:55.450     test.posts to /home/ikeepstudying/mongodb/test/posts.bson  
Tue Dec  3 06:15:55.480          0 objects

实例二:导出指定数据库

[root@localhost mongodb]# mongodump -h 192.168.1.108 -d tank -o /home/ikeepstudying/mongodb/
connected to: 192.168.1.108
Tue Dec  3 06:11:41.618 DATABASE: tank     to     /home/ikeepstudying/mongodb/tank
Tue Dec  3 06:11:41.623     tank.system.indexes to /home/ikeepstudying/mongodb/tank/system.indexes.bson
Tue Dec  3 06:11:41.623          2 objects
Tue Dec  3 06:11:41.623     tank.contact to /home/ikeepstudying/mongodb/tank/contact.bson
Tue Dec  3 06:11:41.669          2 objects
Tue Dec  3 06:11:41.670     Metadata for tank.contact to /home/ikeepstudying/mongodb/tank/contact.metadata.json
Tue Dec  3 06:11:41.670     tank.users to /home/ikeepstudying/mongodb/tank/users.bson
Tue Dec  3 06:11:41.685          2 objects
Tue Dec  3 06:11:41.685     Metadata for tank.users to /home/ikeepstudying/mongodb/tank/users.metadata.json

二、恢复

mongorestoreh dbhost –d dbname –directoryperdb dbdirectory

例如:mongorestore –directoryperdb /usr/ikeepstudying/gideon

-h:MongoDB所在服务器地址

-d:需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2

–directoryperdb:备份数据所在位置,例如:/data0/backup/test,这里为什么要多加一个test,而不是备份时候的backup,读者自己查看提示吧!

–drop:恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

mongorestore -h IP –port 端口 -u 用户名 -p 密码 -d 数据库 –drop 文件存在路径

–drop的意思是,先删除所有的记录,然后恢复。

实例一:恢复所有数据库到mongodb中

[root@localhost mongodb]# mongorestore /home/ikeepstudying/mongodb/   #这里的路径是所有库的备份路径

实例二:还原指定的数据库

[root@localhost mongodb]# mongorestore -d tank /home/ikeepstudying/mongodb/tank/    #tank这个数据库的备份路径  
[root@localhost mongodb]# mongorestore -d tank_new  /home/ikeepstudying/mongodb/tank/    #将tank还有tank_new数据库中

这二个命令,可以实现数据库的备份与还原,文件格式是json和bson的。无法指写到表备份或者还原。

导入导出MongoDB数据

因为这些工具主要通过和运行着的 mongod 实例交互操作,因此它们会影响运行着的数据库的性能。

这些过程对运行着的数据库实例不仅产生流量,而且也强制数据库通读所有内存数据。MongoDB不频繁的读取应用数据能够避免频繁访问数据而导致在数据库常规工作负载方面的性能恶化

参见

MongoDB备份方案 或者 MMS Backup Manual 介绍了更多在MongoDB实例备份方面的信息。此外,考虑以下参考MongoDB导入/导出工具:

数据导入,导出,和备份操作

对于弹性和非破坏性的备份,使用文件系统或块级磁盘快照功能, 例如在文档 MongoDB备份方案 中描述的方法。 这里讨论的工具和操作所提供的功能在某些类型的备份情况下有用。

与此相反,为了保险起见,或者为了访问方便起见,用导入和导出工具来备份一个你的小数据集或移动数据到第三系统或从第三方系统移动数据进来。这些备份可以处理一个小但重要的数据集或者频繁更新的数据部分。

mongoimportmongoexport 并不能可靠地保存所有的富文本 BSON 数据类型,因为 JSON 仅能代表一种BSON支持的子集类型。因此,数据用这些工具导出导入或许会丢失一些精确程度。更多信息参考文档 MongoDB Extended JSON

不管你决定怎样导入导出数据,请考虑一下指导方针:

  • 标记文件,这样你能够区分导出或者备份的内容及导出或备份的时间点。

  • 如果备份过程会对生产线上系统有负面影响的话,不要创建或应用导出。

  • 确保它们反应数据的一致性状态。如果备份过程中不断更新的话,导出或备份过程可能影响数据的完整性与一致性。

  • 通过恢复(restoring)和导入(importing)测试备份与导出来确保备份有用。

人可理解的导入/导出格式

本章描述了用 JSONCSV 格式导入导出集合到文件的过程。

本章中的示例实用MongoDB tools mongoimportmongoexport 。这些工具或许对从第三方应用程序 导入数据到MongoDB数据库有用。

假如你想简单的从一个实例拷贝数据库到另一个实例的话,考虑用 copydb , clone, 或者 cloneCollection 命令。 这些命令或许更适合 上面的任务。 mongo shell 提供 db.copyDatabase() 方法。

mongoimportmongoexport 并不能可靠地保存所有的富文本 BSON 数据类型,因为 JSON 仅能代表一种BSON支持的子集类型。因此,数据用这些工具导出导入或许会丢失一些精确程度。更多信息参考文档 MongoDB Extended JSON

通过用 mongoexport 你能创建备份文件。在最简单的掉用中该命令采用以下形式:

mongoexport --collection collection --out collection.json

这将导出在数据集 collection 中的所有文档到文件 collection.json. 如果没有输出参数 (i.e. “–out collection.json”), mongoexport 将写出处到标准输出 (i.e. “stdout”). 你可以进一步限制结果通过用 “–query” 提供查询过滤 和用 “–db” 限制结果到一个单独的数据库。例如:

mongoexport --db sales --collection contacts --query '{"field": 1}'

这个命令返回在“sales“ 数据库的 contacts 集合中的所有文档,和一个字段名为“field“ 值为 1. 两边用单引号查询确保它不予shell环境相互影响。结果文档将被返回在标准输出中。

默认情况下,mongoexport 每个MongoDB 文档返回一个 JSON document 。指定”–jsonArray” 参数作为一个单独 JSON 数组返回。用 “–csv” 文件 来返回CSV (comma separated values)格式的结果

假如你的 mongod 实例没有运行,你可以用”–dbpath” 选项来指定你的MongoDB实例的数据库文件的位置。参照下面的例子:

mongoexport --db sales --collection contacts --dbpath /srv/MongoDB/

这中方式直接读数据文件,锁定数据目录来避免冲突写。当你用这种配置来运行 mongoexportmongod 进程必须是没有运行的 并且没有连着这些数据文件

–host” 和 “–port“选项允许你指定非本地的主机来连接捕获输出,考虑下面的例子:

mongoexport --host mongodb1.example.net --port 37017 --username user --password pass --collection contacts --out mdb1-examplenet.json

你可以在任何 mongoexport 中向上边例子那样指定用户名密码凭据

mongoexport -h IP –port 端口 -u 用户名 -p 密码 -d 数据库 -c 表名 -f 字段 -q 条件导出 –csv -o 文件名

上面的参数好理解,重点说一下:

-f 导出指字段,以字号分割,-f name,email,age导出name,email,age这三个字段
-q 可以根查询条件导出,-q ‘{ “uid” : “100” }’ 导出uid为100的数据
–csv 表示导出的文件格式为csv的,这个比较有用,因为大部分的关系型数据库都是支持csv,在这里有共同点

实例一:导出整张表

[root@localhost mongodb]# mongoexport -d tank -c users -o /home/ikeepstudying/mongodb/tank/users.dat  
connected to: 127.0.0.1  
exported 4 records

实例二:导出表中部分字段

[root@localhost mongodb]# mongoexport -d tank -c users --csv -f uid,name,sex -o tank/users.csv  
connected to: 127.0.0.1  
exported 4 records

实例三:根据条件敢出数据

[root@localhost mongodb]# mongoexport -d tank -c users -q '{uid:{$gt:1}}' -o tank/users.json  
connected to: 127.0.0.1  
exported 3 records

mongoimport 导入集合

mongoimportmongoexport 并不能可靠地保存所有的富文本 BSON 数据类型,因为 JSON 仅能代表一种BSON支持的子集类型。因此,数据用这些工具导出导入或许会丢失一些精确程度。更多信息参考文档 MongoDB Extended JSON

采取 mongoexport 的方式回复备份,大部分在 mongoexport 中的参数在 mongoimport 中也存在。考虑下面的命令:

mongoimport --collection collection --file collection.json

导入文件“collection.json“的内容到名为“collection“的集合中。如果你不用”–file“选项指定文件, :program:`mongoimport`将从标准输入 (e.g. “stdin.”)接受输入内容。

如果你指定”–upsert“选项,所有的:program:mongoimport 操作将尝试去更新在数据库中已经存在的文档和插入其他文档。这个选项将根据你的配置导致一些性能影响

你能指定数据库选项 –db 来导入这些文档到特定的数据库。如果你的MongoDB实例没用运行,用”–dbpath“选项指定你的MongoDB实例的数据库文件的地址。当你在这个配置中运行 mongoimport`时,考虑用":option:–journal <mongoimport –journal>`”选项来确保:program:`mongoimport`记录它的操作在journal中。mongod“进程必须没有运行并且没有连接这些数据文件。

用”–ignoreBlanks“选项忽略空白字段。对:term:CSVTSV 导入,这个选项提在大部分示例中供需要的功能:它避免插入空白字段到MongoDB文档中。

实例一:还原导出的表数据

[root@localhost mongodb]# mongoimport -d tank -c users --upsert tank/users.dat  
connected to: 127.0.0.1  
Tue Dec  3 08:26:52.852 imported 4 objects

实例二:部分字段的表数据导入

[root@localhost mongodb]# mongoimport -d tank -c users  --upsertFields uid,name,sex  tank/users.dat  
connected to: 127.0.0.1  
Tue Dec  3 08:31:15.179 imported 4 objects

实例三:还原csv文件

[root@localhost mongodb]# mongoimport -d tank -c users --type csv --headerline --file tank/users.csv  
connected to: 127.0.0.1  
Tue Dec  3 08:37:21.961 imported 4 objects

 

MongoDB 系列教程索引 : MongoDB 教程索引 (附有视频)

上一篇: MongoDB 教程五: MongoDB固定集合和性能优化 (索引Indexes, 优化器, 慢查询profile)

下一篇: MongoDB 教程七: MongoDB和PHP结合开发

本文:MongoDB 教程六: MongoDB管理:数据导入导出,数据备份恢复及用户安全与认证