如何在 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文档如下:

Example of JSON Format
{"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:

  1. sudo mkdir /var/backups/mongobackups

然后运行 mongodump:

  1. 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' 来自动获取当前日期。这将使你能够在目录中拥有备份,如 /var/backups/10-29-20/,这对于自动化备份特别方便。

此时,你已经在目录 /var/backups/mongobackups/10-29-20/newdb/ 中完整备份了 newdb 数据库。这个备份包含了恢复 newdb 并保持其所谓的“保真度”所需的所有内容。

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

要实现这一点,请打开 crontab,cron 的编辑器:

  1. sudo crontab -e

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

在cron提示符内,插入以下mongodump命令:

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

在上述命令中,我们故意省略了--db参数,因为您通常希望备份所有数据库。另外,特殊字符%必须转义以符合cron语法。

根据您的MongoDB数据库大小,如果备份太多,您可能很快就会耗尽磁盘空间。这就是为什么建议定期清理旧备份或对其进行压缩。

例如,要删除所有旧于七天的备份,您可以使用以下bash命令:

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

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

  1. sudo crontab -e

插入以下行:

crontab
  1. 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/

一旦您有了带有时间戳的备份,您可以使用以下命令来恢复它(更新日期以匹配您的日期):

  1. 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 服务器都不应该在没有可靠备份策略的情况下运行,比如这里描述的策略。

您可以在这些DigitalOcean 社区文章中找到更多有关配置和使用 MongoDB 的教程。我们也鼓励您查阅官方MongoDB 文档,因为它是了解 MongoDB 提供的可能性的重要资源。

Source:
https://www.digitalocean.com/community/tutorials/how-to-back-up-restore-and-migrate-a-mongodb-database-on-ubuntu-20-04