欢迎你们前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~数据库
MongoDB是最受欢迎的NoSQL数据库引擎之一。它以可扩展,强大,可靠和易于使用而闻名。在本文中,咱们将向您展现如何备份,还原和迁移MongoDB数据库。bash
导入和导出数据库意味着以人类可读的格式处理数据,与其余软件产品兼容。相反,备份和还原操做建立或使用特定于MongoDB的二进制数据,这不只保留了数据的一致性和完整性,还保留了其特定的MongoDB属性。所以,对于迁移,只要源系统和目标系统兼容,一般最好使用备份和恢复。若是您使用了Debian系统,能够参考腾讯云如何在Debian上安装MongoDB的教程。服务器
在学习本教程以前,请确保完成如下准备:机器学习
除非另有说明,不然本教程中须要root权限的全部命令都应做为具备可使用sudo权限的非root用户运行。编辑器
在继续本文以前,须要对此问题有一些基本的了解。若是您有使用MySQL等流行的关系数据库系统的经验,那么在使用MongoDB时可能会发现一些类似之处。工具
您应该知道的第一件事是MongoDB使用json和bson(二进制json)格式来存储其信息。Json是人类可读的格式,很是适合导出和最终导入数据。您可使用任何支持json的工具进一步管理导出的数据,包括简单的文本编辑器。学习
一个示例json文档以下所示:大数据
Example of json Formatui
{"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数据库。
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,咱们将使用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服务。回想一下,备份一般在夜间进行,若是您决定在晚上恢复备份,则会丢失自上次备份以来的全部更新。对于生产环境的服务器,咱们建议您使用腾讯云云关系型数据库,可将您从耗时的数据库管理任务中解放出来,让您有更多时间专一于您的应用和业务。
参考文献:《How To Back Up, Restore, and Migrate a MongoDB Database on Ubuntu 14.04》
问答
相关阅读
此文已由做者受权腾讯云+社区发布,原文连接:cloud.tencent.com/developer/a…
搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!