如何在 Ubuntu 20.04 上备份、恢复和迁移 MongoDB 数据库

作者选择了COVID-19 救济基金来接受捐赠,作为Write for DOnations计划的一部分。

介绍

MongoDB是最流行的 NoSQL 数据库引擎之一。它以可扩展、健壮、可靠和易于使用而闻名。在本文中,您将备份、还原和迁移示例 MongoDB 数据库。

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

先决条件

在学习本教程之前,请确保您完成以下先决条件:

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

第 1 步 – 在 MongoDB 中使用 JSON 和 BSON

在继续阅读本文之前,需要对这个问题有一些基本的了解。如果您有使用其他 NoSQL 数据库系统(例如 Redis)的经验,则在使用 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 主题时可能会考虑这一点

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

步骤 2 —mongodump用于备份 MongoDB 数据库

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

的一个基本参数mongodump--db,它指定要备份的数据库的名称。如果不指定数据库名称,则mongodump备份所有数据库。第二个重要参数是--out,它定义了数据将被转储到的目录。例如,让我们备份newdb数据库并将其存储在/var/backups/mongobackups目录中。理想情况下,我们会将每个备份放在一个目录中,当前日期为/var/backups/mongobackups/10-29-20.

首先创建该目录/var/backups/mongobackups

  • sudo mkdir /var/backups/mongobackups

然后运行mongodump

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

你会看到这样的输出:

Output
2020-10-29T19:22:36.886+0000 writing newdb.restaurants to 2020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

请注意,在上面的目录路径中,我们使用了date +"%m-%d-%y"which 自动获取当前日期。这将允许我们在目录中进行备份,例如. 这在我们自动备份时特别方便。/var/backups/10-29-20/

此时,您newdb在目录中拥有完整的数据库备份此备份具有正确还原并保持其所谓的“保真度”的一切/var/backups/mongobackups/10-29-20/newdb/newdb

作为一般规则,您应该定期进行备份,最好是在服务器负载最低时进行。因此,您可以将mongodump命令设置为 cron 作业,使其定期运行,例如,每天凌晨 03:03。

要完成这个打开的 crontab,cron 的编辑器:

  • sudo crontab -e

请注意,当您运行 时sudo crontab,您将为 root 用户编辑 cron 作业。建议这样做,因为如果您为用户设置 cron,它们可能无法正确执行,尤其是当您的 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 AM。为此,再次打开 crontab:

  • sudo crontab -e

之后插入以下行:

定时任务表
1 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

保存并关闭文件。

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

步骤 3 —mongorestore用于恢复和迁移 MongoDB 数据库

当您从以前的备份中恢复 MongoDB 数据库时,您将拥有在特定时间获取的 MongoDB 信息的精确副本,包括所有索引和数据类型。当您要迁移 MongoDB 数据库时,这尤其有用。为了恢复 MongoDB,我们将使用命令mongorestore,它与mongodump生成的二进制备份一起使用

让我们继续我们的newdb数据库示例,看看我们如何从以前的备份中恢复它。我们将首先使用--nsInclude参数指定数据库的名称我们将newdb.*用于恢复所有集合。要恢复单个集合,例如restaurants,请newdb.restaurants改用。

然后,使用--drop,我们将确保首先删除目标数据库,以便在干净的数据库中恢复备份。作为最后一个参数,我们将指定的最后一个备份,这将是这个样子的目录:/var/backups/mongobackups/10-29-20/newdb/

有了带时间戳的备份后,您可以使用以下命令恢复它:

  • sudo mongorestore --db newdb --drop /var/backups/mongobackups/10-29-20/newdb/

你会看到这样的输出:

Output
2020-10-29T19:25:45.825+0000 the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead 2020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir 2020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json 2020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson 2020-10-29T19:25:46.130+0000 no indexes to restore 2020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents) 2020-10-29T19:25:46.130+0000 done

在上述情况下,我们在创建备份的同一台服务器上恢复数据。如果您希望将数据迁移到另一台服务器并使用相同的技术,您应该将备份目录(在我们的示例中)复制到另一台服务器。/var/backups/mongobackups/10-29-20/newdb/

结论

您现在已经执行了一些与备份、恢复和迁移 MongoDB 数据库相关的基本任务。没有可靠的备份策略,任何生产 MongoDB 服务器都不应该运行,例如这里描述的那个。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁