如何导入和在Ubuntu 14.04导出MongoDB数据库

MongoDB是最流行的NoSQL数据库引擎之一。 它是着名的是可扩展,强大,可靠和易于使用。 在本文中,我们将向您介绍如何导入和导出MongoDB数据库。

我们应该明确,通过本文中的导入和导出,我们的意思是以人类可读的格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留数据的一致性和完整性,而且保留其特定的MongoDB属性。 因此,对于迁移,只要源系统和目标系统兼容,通常优选使用备份和恢复。 备份,恢复和迁移已经超出了本文的范围-是指如何备份,还原和迁移MongoDB数据库在Ubuntu 14.04

先决条件

在遵循本教程之前,请确保您满足以下先决条件:

除非另有说明,本教程中需要root权限的所有命令都应以具有sudo权限的非root用户身份运行。

了解基本知识

在继续进一步讨论本文之前,需要对这一问题有一些基本的了解。 如果你有流行的关系数据库系统如MySQL的经验,你可能会发现一些相似之处,使用MongoDB。

你应该知道的第一件事是,MongoDB使用JSON和BSON(二进制JSON)格式存储的信息。 Json是人类可读的格式,非常适合导出和最终导入您的数据。 您可以使用支持json的任何工具进一步管理导出的数据,包括简单的文本编辑器。

示例json文档如下所示:

json格式的示例
{"address":[
    {"building":"1007", "street":"Park Ave"},
    {"building":"1008", "street":"New Ave"},
]}

Json非常方便使用,但它不支持所有在bson中可用的数据类型。 这意味着如果你使用json,将会有信息的所谓“失去保真”。 这就是为什么备份/恢复最好使用二进制bson,这将能够更好地还原您的MongoDB数据库。

第二,你不必担心显式创建MongoDB数据库。 如果您指定要导入的数据库不存在,则会自动创建。 更好的情况是集合(数据库表)结构。 与其他数据库引擎相反,在MongoDB中,结构再次在第一个文档(数据库行)插入时自动创建。

第三,在MongoDB读取或插入大量数据,例如对于本文的任务,可能是资源密集型,消耗大量的CPU,内存和磁盘空间。 考虑到MongoDB经常用于大型数据库和大数据,这是非常关键的。 对这个问题最简单的解决方案是在夜间运行exports / backups。

第四,如果您有一个繁忙的MongoDB服务器,信息在数据库导出过程中更改,信息一致性可能会有问题。 这个问题没有简单的解决方案,但在本文结尾,您将看到有关进一步了解复制的建议。

将信息导入MongoDB

为了了解如何将信息导入MongoDB,我们使用一个关于餐馆的流行示例MongoDB数据库。 它在以.json格式,并且可以使用下载wget是这样的:

wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

一旦下载完成,你应该有一个文件叫做primer-dataset.json在当前目录(12 MB大小)。 让我们导入数据从该文件到一个新的数据库名为newdb和到一个集合叫restaurants 对于导入,我们将使用命令mongoimport是这样的:

sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json

结果应如下所示:

输出mongoimport
2016-01-17T14:27:04.806-0500    connected to: localhost
2016-01-17T14:27:07.315-0500    imported 25359 documents

如上面的命令所示,已导入25359个文档。 因为我们没有一个数据库,称为newdb ,MongoDB的创建它自动。

让我们通过连接到名为新创建的MongoDB数据库验证导入newdb是这样的:

sudo mongo newdb

你现在被连接到新创建的newdb数据库实例。 请注意,您的提示已更改,表示您已连接到数据库。

使用命令计算restaurants集合中的文档:

db.restaurants.count()

结果应该展会上25359 ,进口单据数完全。 为了更好的检查,您可以从餐馆集合中选择第一个文档,如下所示:

db.restaurants.findOne() 

结果应如下所示:

db.restaurants.findOne()的输出
{
        "_id" : ObjectId("569beb098106480d3ed99926"),
        "address" : {
                "building" : "1007",
                "coord" : [
                        -73.856077,
                        40.848447
                ],
                "street" : "Morris Park Ave",
                "zipcode" : "10462"
        },
        "borough" : "Bronx",
        "cuisine" : "Bakery",
        "grades" : [
                {
                        "date" : ISODate("2014-03-03T00:00:00Z"),
                        "grade" : "A",
                        "score" : 2
                },
...
        ],
        "name" : "Morris Park Bake Shop",
        "restaurant_id" : "30075445"
}

这样一个详细的检查可以揭示与文件的问题,如他们的内容,编码等JSON格式采用UTF-8编码,你的出口和进口应在该编码。 如果你手动编辑json文件,请记住这一点。 否则,MongoDB会自动为你处理它。

要退出MongoDB的提示符下,键入exit在提示符下:

exit

您将作为非root用户返回到正常的命令行提示符。

从MongoDB导出信息

正如我们以前提到的,通过导出MongoDB信息,您可以获取一个人类可读的文本文件与您的数据。 默认情况下,信息以json格式导出,但也可以导出为csv(逗号分隔值)。

若要从MongoDB的信息导出,使用命令mongoexport 它允许您导出非常细粒度的导出,以便您可以指定数据库,集合,字段,甚至使用查询进行导出。

一个简单的mongoexport例子是到餐厅集合从出口newdb我们先前进口的数据库。 它可以这样做:

sudo mongoexport --db newdb -c restaurants --out newdbexport.json

在上述命令中,我们使用--db指定数据库, -c收集和--out在其中的数据将被保存的文件。

一个成功的输出mongoexport应该是这样的:

mongoexport的输出
2016-01-20T03:39:00.143-0500    connected to: localhost
2016-01-20T03:39:03.145-0500    exported 25359 records

以上输出显示已导入25359个文档 - 与导入的文档相同。

在某些情况下,您可能只需要导出集合的一部分。 考虑到餐厅json文件的结构和内容,让我们出口所有满足标准的餐厅,位于布朗克斯区,并有中国菜。 如果我们想要在连接到MongoDB时直接获取此信息,请再次连接到数据库:

sudo mongo newdb

然后,使用以下查询:

db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )

结果显示到终端。 要退出MongoDB的提示符下,键入exit在提示符下:

exit

如果你想将数据从一个sudo命令行,而不是同时连接到数据库中导出,使以前的查询部分mongoexport通过指定它的命令-q这样的说法:

sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json

请注意,我们在查询条件的双引号内使用单引号。 如果使用双引号或特殊字符,如$ ,你将不得不与反斜杠(逃避他们\查询)。

如果导出成功,结果应如下所示:

mongoexport的输出
2016-01-20T04:16:28.381-0500    connected to: localhost
2016-01-20T04:16:28.461-0500    exported 323 records

上述结果表明323条记录已经出口了,你可以在找到他们Bronx_Chinese_retaurants.json我们所指定的文件。

结论

本文介绍了向/从MongoDB数据库导入和导出信息的要点。 您可以继续在进一步阅读如何备份,还原和迁移MongoDB数据库在Ubuntu 14.04如何建立一个可伸缩的MongoDB数据库

复制不仅对可扩展性有用,而且对当前主题也很重要。 复制允许您从一个从属MongoDB服务器不间断地继续运行您的MongoDB服务器,同时从失败中恢复主服务器。 复制的部分也是操作日志(OPLOG) ,记录所有修改数据的操作。 您可以使用此日志,就像使用MySQL中的二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在夜间进行,如果您决定在晚上恢复备份,则将缺少自上次备份以来的所有更新。

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏