如何备份,还原和迁移MongoDB数据库在Ubuntu 14.04

MongoDB是最流行的NoSQL数据库引擎之一。 它是着名的是可扩展,强大,可靠和易于使用。 在本文中,我们将向您展示如何备份,恢复和迁移您的MongoDB数据库。

导入和导出数据库意味着以人类可读格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留数据的一致性和完整性,而且保留其特定的MongoDB属性。 因此,对于迁移,只要源系统和目标系统兼容,通常优选使用备份和恢复。

先决条件

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

除非另有说明,本教程中需要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读取或插入大量数据,例如对于本文的任务,可能是资源密集型,消耗大量的CPU,内存和磁盘空间。 考虑到MongoDB经常用于大型数据库和大数据,这是非常关键的。 此问题的最简单的解决方案是在夜间或非高峰时间运行导出和备份。

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

虽然你可以使用导入和导出功能,备份和恢复数据,有更好的方法,以确保您的MongoDB数据库的全面完整性。 要备份你的数据,你应该使用命令mongodump 对于恢复,使用mongorestore 让我们看看它们是如何工作的。

备份MongoDB数据库

让我们先介绍一下备份MongoDB数据库。

一个重要的论据mongodump--db ,指定要备份的数据库的名称。 如果不指定数据库名称, mongodump备份所有的数据库。 第二个重要的参数是--out它指定了数据将被倾倒的目录。 让我们用备份的例子newdb数据库,并将其存储在/var/backups/mongobackups目录。 理想情况下,我们将有我们每一个备份与当前日期类似于目录/var/backups/mongobackups/01-20-16 (2016年1月20日)。 首先,让我们创建一个目录/var/backups/mongobackups使用以下命令:

sudo mkdir /var/backups/mongobackups

然后我们的备份命令应该看起来像这样:

sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`

成功执行的备份将具有以下输出:

mongodump的输出
2016-01-20T10:11:57.685-0500    writing newdb.restaurants to /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:11:57.907-0500    writing newdb.restaurants metadata to /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:11:57.911-0500    done dumping newdb.restaurants (25359 documents)
2016-01-20T10:11:57.911-0500    writing newdb.system.indexes to /var/backups/mongobackups/01-20-16/newdb/system.indexes.bson

请注意,在上面的目录路径,我们已经使用date +"%m-%d-%y"自动获取当前日期。 这将使我们有目录内备份/var/backups/ 01-20-16 / 当我们自动执行备份时,这是特别方便。

在这一点上,你有一个完整的备份newdb在目录数据库中/var/backups/mongobackups/ 01-20-16 /newdb/ 该备份拥有一切恢复newdb正确并保持其所谓的“保真”。

作为一般规则,您应该定期进行备份,例如每天进行备份,最好在服务器负载最小的时间进行备份。 因此,您可以设置mongodump在上午03时03分命令,以便它定期运行cron作业,例如每一天。 要完成这个开放crontab,cron的编辑器这样:

sudo crontab -e

请注意,当您运行sudo crontab你会被编辑cron作业root用户。 建议这样做,因为如果您为用户设置cron,它们可能无法正确执行,特别是如果您的sudo配置文件需要密码验证。

里面的crontab提示插入以下mongodump命令:

Crontab窗口
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`

在上述命令中,我们省略--db故意的说法,因为通常你会希望有所有的数据库备份的。

根据您的MongoDB数据库大小,您可能很快就会用尽太多备份的磁盘空间。 这就是为什么它还建议定期清理旧备份或压缩它们。 例如,要删除7天以前的所有备份,您可以使用以下bash命令:

find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

类似于先前mongodump命令,这其中也可以加入一个cron作业。 它应该在您开始下一次备份之前运行,例如在03:01 AM。 为此目的再次打开crontab:

sudo crontab -e

然后插入以下行:

Crontab窗口
3 1 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

完成此步骤中的所有任务将确保为MongoDB数据库提供良好的备份解决方案。

恢复和迁移MongoDB数据库

通过从先前的备份(例如上一步备份的备份)恢复MongoDB数据库,您将能够获取在某个时间取得的MongoDB信息的精确副本,包括所有索引和数据类型。 当您要迁移MongoDB数据库时,这是非常有用的。 对于恢复的MongoDB,我们将使用命令mongorestore它与所产生的二进制备份工作mongodump

让我们继续我们的例子中与newdb数据库,看看我们可以把它从以前拍摄的备份还原。 作为参数,我们将先指定与数据库的名称--db参数。 然后用--drop我们将确保该目标数据库第一次下降,这样,备份是一个干净的数据库恢复。 作为最后一个参数我们将指定上次备份的目录/var/backups/mongobackups/ 01-20-16 /newdb/ 所以整个命令将看起来像这样(替换为您希望恢复的备份的日期):

sudo mongorestore --db newdb --drop /var/backups/mongobackups/01-20-16/newdb/

成功执行将显示以下输出:

mongorestore的输出
2016-01-20T10:44:47.876-0500    building a list of collections to restore from /var/backups/mongobackups/01-20-16/newdb/ dir
2016-01-20T10:44:47.908-0500    reading metadata file from /var/backups/mongobackups/01-20-16/newdb/restaurants.metadata.json
2016-01-20T10:44:47.909-0500    restoring newdb.restaurants from file /var/backups/mongobackups/01-20-16/newdb/restaurants.bson
2016-01-20T10:44:48.591-0500    restoring indexes for collection newdb.restaurants from metadata
2016-01-20T10:44:48.592-0500    finished restoring newdb.restaurants (25359 documents)
2016-01-20T10:44:48.592-0500    done

在上述情况下,我们正在还原已创建备份的同一服务器上的数据。 如果您想将数据迁移到另一台服务器,并使用相同的技术,你应该只复制备份目录,这是/var/backups/mongobackups/ 01-20-16 /newdb/在我们的例子中,到其他服务器。

结论

本文介绍了在备份,恢复和迁移数据库方面管理MongoDB数据的要点。 您可以继续在进一步阅读如何建立一个可伸缩的MongoDB数据库中复制的MongoDB解释。

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

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

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

支付宝扫一扫打赏

微信扫一扫打赏