MongoDB可谓目前人气最高的NoSQL数据库引擎之一。其凭借着出色的可扩展性、可靠性与易用性征服了无数用户。今天,我们将共同探讨如何备份、恢复及迁移MogoDB数据库。
对数据库进行导入与导出意味着需要以人类可读的格式处理数据,且确保其与其它软件产品相兼容。相比之下,备份与恢复操作则创建或使用MongoDB专用的二进制数据,其不仅能够保护数据本身的统一性与完整性,同时亦拥有独特的MongoDB属性。因此,只要源与目标系统彼此兼容,我们一般更倾向于使用备份与恢复机制。
先决条件
Ubuntu 14.04 Droplet
非root sudo用户。
相关基础
如果大家了解MySQL等热门关系数据库系统,就会发现MongoDB的使用方式与其非常相似。
在上手MongoDB时,首先要了解的是json与bson(binary json)格式,它们负责对信息进行存储。Json是一种人类可阅读格式,更适用于数据的导出与导入。大家可以利用任何支持json格式的工具进行数据导出,包括文本编辑器。
下面来看json示例文档:
Example of json Format
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
Json格式易于处理,但却无法支持bson中的全部数据类型。这意味着如果选择使用json,则会发现部分信息“失真”。因此在备份与恢复工作中,我们最好选择二进制bson。
另外,大家不必在创建MongoDB数据库方面下太大功夫。如果大家指定要导入的数据库并不存在,系统会自动进行创建。更重要的是,其采用collection(数据库表)结构。相较于其它数据库引擎,MongoDB的结构能够根据插入的第一个文档(数据库行)自动创建。
第三,MongoDB所读取或者插入的大量数据可能占用大量资源,包括CPU、内存与磁盘空间。在利用MongoDB处理大型数据集及大数据时,这一点必须认真考量。最简单的解决方案就是在夜间或非高峰时段进行数据导出与备份。
第四,如果大家的MongoDB服务器在数据库导出或备份过程中发生信息变更,则可能影响到信息一致性。这一难题没有简单办法可以解决,不过在本文结尾,我们将针对复制操作给出参考资料。
虽然在数据备份与恢复时,导入与导出功能能够实现这一效果,但大家也可以利用其它更好的办法来确保MongoDB数据库的完整性。要对数据进行备份,大家应当使用mongodump命令。而在恢复时,则使用mongorestore。
备份MongoDB数据库
首先来看MongoDB数据库的备份方式。
Mongodump命令的一项重要参数正是–db,其负责指定大家希望备份的数据库名称。如果大家不指定数据库名称,则mongodump会备份全部数据库。第二项为–out,用于指定数据备份至哪个目录。假设我们希望将newdb数据库存储在/var/backups/mongobackups目录下,则备份数据处于/var/backups/mongobackups/01-20-16。首先,使用以下命令创建/var/backups/mongobakcups目录:
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
请注意,我们在前面的目录路径处使用了+”%m-%d-%y”,其会直接获取当前数据,并将其备份至/var/backups/01-20-16/目录当中。这一机制非常适用于自动备份。
现在,大家已经在/var/backups/mongobackups/01-20-16/newdb/目录中拥有了完整的newdb数据库备份。此备份副本包含一切恢复所必需的newdb信息,也就是所谓“保真”。
一般来讲,我们需要对数据库进行定期备份,例如每天一次或者选择服务器负载较低的时段。因此,大家可以将mongodump命令设置为cron任务以定期执行,命令如下:
sudo crontab -e
请注意,sudo crontab要求我们以root用户编辑该cron任务。
在crontab提示符下插入以下mongodump命令:
Crontab window
3 3 * * * mongodump --out /var/backups/mongobackups/`date +"%m-%d-%y"`
在以上命令中,我们使用了–db参数以确保全部数据库都能得到备份。
根据MongoDB数据库的具体规模,过为频繁的备份可能导致磁盘空间不足。因此我们需要定期清除旧有备份或者进行压缩。例如通过以下命令每七天删除全部旧有备份:
find /var/backups/mongobackups/ -mtime +7 -exec rm -rf {} \;
这条命令也可被添加为cron任务。其应当在开始下一次备份前运行,因此下面再次打开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服务的同时,对主服务器进行恢复。另外,复制功能还可实现操作日志(oplog)机制,其能够记录全部对数据做出修改的操作。大家可以利用该日志对最后一次备份之后的数据进行恢复。备份工作通常在夜间进行,因此如果大家决定利用夜间的备份副本进行恢复,往往会错失大量数据更新。在这种情况下,日志恢复就变得非常重要了。