如何在Ubuntu20.04上备份、恢复和迁移MongoDB数据库
作者选择了 COVID-19 Relief Fund 作为 Write for DOnations 计划的一部分来接受捐赠。
介绍
MongoDB 是最流行的 NoSQL 数据库引擎之一。 它以可扩展、健壮、可靠和易于使用而闻名。 在本文中,您将备份、恢复和迁移示例 MongoDB 数据库。
导入和导出数据库意味着以与其他软件产品兼容的人类可读格式处理数据。 相比之下,MongoDB 的备份和恢复操作创建或使用特定于 MongoDB 的二进制数据,这不仅保留了数据的一致性和完整性,还保留了其特定的 MongoDB 属性。 因此,对于迁移,只要源系统和目标系统兼容,通常最好使用备份和恢复。
先决条件
在学习本教程之前,请确保您完成以下先决条件:
- 根据 Ubuntu 20.04 初始服务器设置指南 设置一个 Ubuntu 20.04 Droplet,包括 sudo 非 root 用户和防火墙。
- 使用文章 如何在 Ubuntu 20.04 上安装 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 服务器,在数据库导出或备份过程中信息发生变化,则信息一致性可能会出现问题。 这个问题的一个可能的解决方案是 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
:
sudo mkdir /var/backups/mongobackups
然后运行 mongodump
:
sudo mongodump --db newdb --out /var/backups/mongobackups/`date +"%m-%d-%y"`
你会看到这样的输出:
Output2020-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 的编辑器:
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
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/
你会看到这样的输出:
Output2020-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 服务器都不应该运行。