MongoDB https://cloud.tencent.com/developer/article/1138681 是最受欢迎的 NoSQL 数据库引擎之一. 它以可扩展, 强大, 可靠和易于使用而闻名. 在本文中, 我们将向您展示如何备份, 还原和迁移 MongoDB 数据库.
导入和导出数据库意味着以人类可读的格式处理数据, 与其他软件产品兼容. 相反, 备份和还原操作创建或使用特定于 MongoDB 的二进制数据, 这不仅保留了数据的一致性和完整性, 还保留了其特定的 MongoDB 属性. 因此, 对于迁移, 只要源系统和目标系统兼容, 通常最好使用备份和恢复. 如果您使用了 Debian 系统, 可以参考腾讯云如何在 Debian 上安装 MongoDB https://cloud.tencent.com/developer/article/1174423 的教程.
准备
在学习本教程之前, 请确保完成以下准备:
Ubuntu 14.04 服务器
拥有 sudo 权限的非 root 用户.
导入示例 MongoDB 数据库
除非另有说明, 否则本教程中需要 root 权限的所有命令都应作为具有可以使用 sudo 权限的非 root 用户运行.
了解基础知识
在继续本文之前, 需要对此问题有一些基本的了解. 如果您有使用 MySQL 等流行的关系数据库系统的经验, 那么在使用 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 数据库的完整性. 要备份数据, 您应该使用 mongodump 命令. 要恢复, 请使用 mongorestore 命令. 让我们看看它们是如何工作的.
备份 MongoDB 数据库
我们首先介绍备份 MongoDB 数据库.
mongodumpis 的一个重要参数 --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"`
成功执行的备份将具有如下输出结果:
- Output of mongodump
- 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 命令:
- Crontab window
- 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 window
- 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/
成功执行将显示以下输出结果:
- Output of mongorestore
- 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 数据的要点.
复制不仅对可伸缩性有用, 而且对当前主题也很重要. 复制允许您在从故障恢复主服务器时从 MongoDB 服务器中不间断地继续运行 MongoDB 服务. 回想一下, 备份通常在夜间进行, 如果您决定在晚上恢复备份, 则会丢失自上次备份以来的所有更新. 对于生产环境的服务器, 我们建议您使用腾讯云云关系型数据库 https://cloud.tencent.com/product/cdb-overview , 可将您从耗时的数据库管理任务中解放出来, 让您有更多时间专注于您的应用和业务.
参考文献:How To Back Up, Restore, and Migrate a MongoDB Database on Ubuntu 14.04
问答
Angular2 如何处理 http 响应? https://cloud.tencent.com/developer/ask/99546?fromSource=waitui
来源: https://www.cnblogs.com/qcloud1001/p/9505493.html