如何在Ubuntu14.04上备份、恢复和迁移MongoDB数据库

来自菜鸟教程
跳转至:导航、​搜索

介绍

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/ 中进行备份。 当我们自动化备份时,这特别方便。

至此,您在目录 /var/backups/mongobackups/01-20-16/newdb/ 中拥有了 newdb 数据库的完整备份。 此备份具有正确恢复 newdb 并保持其所谓的“保真度”的一切。

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

sudo crontab -e

请注意,当您运行 sudo crontab 时,您将为 root 用户编辑 cron 作业。 建议这样做,因为如果您为用户设置 crons,它们可能无法正确执行,尤其是在您的 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。 为此,再次打开 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 中使用二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在晚上进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。