MongoDB是最流行的NoSQL数据库引擎之一。 它是着名的是可扩展,强大,可靠和易于使用。 在本文中,我们将向您展示如何备份,恢复和迁移您的MongoDB数据库。
导入和导出数据库意味着以人类可读格式处理数据,与其他软件产品兼容。 相比之下,备份和恢复操作创建或使用MongoDB特定的二进制数据,这不仅保留数据的一致性和完整性,而且保留其特定的MongoDB属性。 因此,对于迁移,只要源系统和目标系统兼容,通常优选使用备份和恢复。
先决条件
在遵循本教程之前,请确保您满足以下先决条件:
- Ubuntu 14.04 Droplet
- 非root sudo用户。 退房初始服务器设置与Ubuntu 14.04的详细信息。
- MongoDB的安装和使用该文章配置如何在Ubuntu 14.04安装MongoDB的 。
- 使用中的说明例子的MongoDB数据库导入如何导入和在Ubuntu 14.04导出MongoDB数据库
除非另有说明,本教程中需要root权限的所有命令都应以具有sudo权限的非root用户身份运行。
了解基本知识
在继续进一步讨论这篇文章之前,需要对这个问题有一些基本的了解。 如果你有流行的关系数据库系统如MySQL的经验,你可能会发现一些相似之处,使用MongoDB。
你应该知道的第一件事是,MongoDB使用JSON和BSON(二进制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服务器,在数据库导出或备份过程中信息发生变化,信息一致性可能会有问题。 这个问题没有简单的解决方案,但在本文结尾,您将看到有关进一步了解复制的建议。
虽然你可以使用导入和导出功能,备份和恢复数据,有更好的方法,以确保您的MongoDB数据库的全面完整性。 要备份你的数据,你应该使用命令mongodump
。 对于恢复,使用mongorestore
。 让我们看看它们是如何工作的。
备份MongoDB数据库
让我们先介绍一下备份MongoDB数据库。
一个重要的论据mongodump
是--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"`
成功执行的备份将具有以下输出:
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 /
。 当我们自动执行备份时,这是特别方便。
在这一点上,你有一个完整的备份newdb
在目录数据库中/var/backups/mongobackups/ 01-20-16 /newdb/
。 该备份拥有一切恢复newdb
正确并保持其所谓的“保真”。
作为一般规则,您应该定期进行备份,例如每天进行备份,最好在服务器负载最小的时间进行备份。 因此,您可以设置mongodump
在上午03时03分命令,以便它定期运行cron作业,例如每一天。 要完成这个开放crontab,cron的编辑器这样:
sudo crontab -e
请注意,当您运行sudo crontab
你会被编辑cron作业root用户。 建议这样做,因为如果您为用户设置cron,它们可能无法正确执行,特别是如果您的sudo配置文件需要密码验证。
里面的crontab提示插入以下mongodump
命令:
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 AM。 为此目的再次打开crontab:
sudo crontab -e
然后插入以下行:
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/
成功执行将显示以下输出:
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解释。
复制不仅对可扩展性有用,而且对当前主题也很重要。 复制允许您从一个从属MongoDB服务器不间断地继续运行您的MongoDB服务器,同时从失败中恢复主服务器。 复制的部分也是操作日志(OPLOG) ,记录所有修改数据的操作。 您可以使用此日志,就像使用MySQL中的二进制日志一样,在上次备份发生后恢复您的数据。 回想一下,备份通常在夜间进行,如果您决定在晚上恢复备份,则将缺少自上次备份以来的所有更新。