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

作者选择了 COVID-19 救援基金作为 Write for Donations计划的一部分,接受捐款。

介绍

MongoDB是最受欢迎的数据库引擎之一(https://andsky.com/tech/tutorials/a-comparison-of-nosql-database-management-systems-and-models)。 它以可扩展,强大,可靠和易于使用而闻名。 数据库引擎. 它以可扩展,强大,可靠和易于使用而闻名。 在本文中,您将备份,恢复和迁移样本MongoDB数据库。

导入和导出数据库意味着处理与其他软件产品兼容的人读格式的数据,相反,MongoDB的备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的MongoDB属性。

前提条件

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

除非另有说明,本教程中需要 root 特权的所有命令都应该作为具有 sudo 特权的非 root 用户运行。

步骤 1 — 在 MongoDB 中使用 JSON 和 BSON

如果您有其他 NoSQL 数据库系统的经验,如 Redis,您可能会在使用 MongoDB 时发现一些相似之处。

MongoDB 使用 JSON 和 BSON (二进制 JSON) 格式来存储其信息. JSON 是可人读的格式,非常适合导出并最终导入您的数据。

一个.json 文档的例子看起来像这样:

1[label Example of JSON Format]
2{"address":[
3    {"building":"1007", "street":"Park Ave"},
4    {"building":"1008", "street":"New Ave"},
5]}

使用JSON很方便,但它不支持BSON中可用的所有数据类型,这意味着如果使用JSON,信息将出现所谓的忠诚度损失

其次,您不必担心明确创建MongoDB数据库。如果您指定用于导入的数据库已经不存在,则它会自动创建。更糟糕的是,与其他数据库引擎不同,在MongoDB中,结构在第一个文档(数据库行)插入时再次自动创建。

第三,在MongoDB中,读取或插入大量数据,例如本文中的任务,可以耗费大量资源,消耗大量的CPU、内存和磁盘空间。

第四,如果您有一个繁忙的 MongoDB 服务器,信息在数据库导出或备份过程中发生变化,信息的一致性可能会有问题。 此问题的一个可能的解决方案是 replication,当您在 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:

1sudo mkdir /var/backups/mongobackups

然后再来Mongodump:

1sudo mongodump --db newdb --out /var/backups/mongobackups/$(date +'%m-%d-%y')

你会看到这样的输出:

1[secondary_label Output]
22020-10-29T19:22:36.886+0000 writing newdb.restaurants to
32020-10-29T19:22:36.969+0000 done dumping newdb.restaurants (25359 documents)

请注意,在上面的目录路径中,您使用date +%m-%d-%y自动获取当前日期,这将允许您在目录中有备份,如/var/backups/10-29-20/`,这使得它特别方便用于自动备份。

在此时,您在目录中拥有完整的newdb数据库备份 /var/backups/mongobackups/10-29-20/newdb/

一般来说,您应该定期进行备份,最好是在服务器负载最少的时候。因此,您可以将mongodump命令设置为 cron 任务,以便它定期运行,例如每天上午 3 点03分。

要完成这个开放的crontab,Cron 的编辑器:

1sudo crontab -e

当您运行sudo crontab时,您将为 root 用户编辑 cron 工作,这是建议的,因为如果您为您的用户设置 crons,它们可能无法正确执行,特别是如果您的 sudo 配置文件需要密码验证。

在 crontab 提示中,插入以下mongodump命令:

1[label crontab]
23 3 * * * mongodump --out /var/backups/mongobackups/$(date +'\%m-\%d-\%y')

在上面的命令中,我们将--db参数故意省略,因为您通常会希望所有的数据库都备份,此外,特殊字符%必须被省略以符合 cron 语法。

根据您的 MongoDB 数据库大小,您可能很快就会失去磁盘空间,备份太多了,这就是为什么建议定期清理旧备份或压缩它们的原因。

例如,要删除所有超过 7 天的备份,可以使用以下 bash 命令:

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

与之前的mongodump命令类似,您也可以将此命令添加为 cron 任务,它应该在您开始下一个备份之前运行;对于 03:03 AM 任务,此删除将于 03:01 AM 运行。

1sudo crontab -e

插入下列行:

1[label crontab]
21 3 * * * find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;

保存并关闭文件。

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

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

当您从以前的备份恢复您的 MongoDB 数据库时,您有确切的 MongoDB 信息副本,包括所有索引和数据类型,这在您想要迁移 MongoDB 数据库时尤其有用。

让我们继续我们用newdb数据库的例子,看看我们如何从以前的备份中恢复它。我们首先用--nsInclude参数指定数据库的名称。

然后,使用--drop,我们将确保目标数据库首先被放下,以便备份恢复到清洁的数据库中。

一旦你有一个时刻标记的备份,你可以使用这个命令恢复它(更新日期以匹配你的):

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

你会看到这样的输出:

1[secondary_label Output]
22020-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
32020-10-29T19:25:45.826+0000 building a list of collections to restore from /var/backups/mongobackups/10-29-20/newdb dir
42020-10-29T19:25:45.829+0000 reading metadata for newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.metadata.json
52020-10-29T19:25:45.834+0000 restoring newdb.restaurants from /var/backups/mongobackups/10-29-20/newdb/restaurants.bson
62020-10-29T19:25:46.130+0000 no indexes to restore
72020-10-29T19:25:46.130+0000 finished restoring newdb.restaurants (25359 documents)
82020-10-29T19:25:46.130+0000 done

如果您希望将数据迁移到另一个服务器并使用相同的技术,您应该将备份目录复制到另一个服务器,即 /var/backups/mongobackups/10-29-20/newdb/在我们的情况下。

结论

您现在已经完成了一些与备份、恢复和迁移 MongoDB 数据库相关的基本任务. 没有生产 MongoDB 服务器应该在没有可靠的备份策略的情况下运行,如这里所描述的。

您可以在这些 [DigitalOcean 社区文章] 中找到有关如何配置和使用 MongoDB 的更多教程(https://andsky.com/tags/mongodb?type=tutorial&subtype=tutorial)。

Published At
Categories with 技术
comments powered by Disqus