如何在 Ubuntu 14.04 上备份、恢复和迁移 MongoDB 数据库
介绍
MongoDB 是最流行的 NoSQL 数据库引擎之一。它以可扩展、强大、可靠和易于使用而闻名。在本文中,我们将向您展示如何备份、还原和迁移您的 MongoDB 数据库。
导入和导出数据库意味着以人类可读的格式处理数据,并与其他软件产品兼容。相比之下,备份和恢复操作创建或使用特定于 MongoDB 的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的 MongoDB 属性。因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。
先决条件
在学习本教程之前,请确保您完成以下先决条件:
- Ubuntu 14.04 Droplet
- 非 root sudo 用户。查看 Ubuntu 14.04 的初始服务器设置以了解详细信息。
- 使用文章如何在 Ubuntu 14.04 上安装 MongoDB 安装和配置 MongoDB。
- 使用如何在 Ubuntu 14.04 上导入和导出 MongoDB 数据库中的说明导入的示例 MongoDB 数据库
除非另有说明,否则本教程中所有需要 root 权限的命令都应以具有 sudo 权限的非 root 用户身份运行。
了解基础知识
在继续本文之前,需要对此事有一些基本的了解。如果您有使用流行的关系数据库系统(如 MySQL)的经验,您可能会在使用 MongoDB 时发现一些相似之处。
您应该知道的第一件事是 MongoDB 使用 json 和 bson(二进制 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"`
成功执行的备份将具有如下输出:
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
命令:
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
之后插入以下行:
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/
成功执行将显示以下输出:
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 数据的要点。您可以继续进一步阅读 How To Set Up a Scalable MongoDB Database,其中解释了 MongoDB 复制。
复制不仅对可伸缩性有用,而且对当前的主题也很重要。复制允许您在从故障中恢复主服务器时从从属 MongoDB 服务器不间断地继续运行 MongoDB 服务。复制的一部分也是操作日志(oplog),它记录了所有修改数据的操作。您可以使用此日志,就像在 MySQL 中使用二进制日志一样,在上次备份发生后恢复数据。回想一下,备份通常在夜间进行,如果您决定在晚上恢复备份,您将丢失自上次备份以来的所有更新。