如何在Ubuntu 14.04上创建和使用MongoDB备份

介绍

今天许多现代Web应用程序开发人员都选择在他们的项目中使用NoSQL数据库,而MongoDB通常是他们的首选。如果您在生产场景中使用MongoDB,则定期创建备份以避免数据丢失非常重要。幸运的是,MongoDB提供了简单的命令行工具来创建和使用备份。本教程将介绍如何使用这些工具。

要了解备份如何在不篡改现有数据库的情况下工作,本教程将首先引导您创建一个新数据库并向其中添加少量数据。然后,您将创建数据库的备份,然后删除数据库并使用备份还原它。

准备

要继续,您将需要:

  • 一个可以使用sudo权限的非root用户的64位Ubuntu 14.04 Droplet,没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后再购买服务器
  • 将MongoDB 3.0.7安装在您的服务器上。

第1步 - 创建示例数据库

创建空数据库的备份不是很有用,因此在此步骤中,我们将创建一个示例数据库并向其中添加一些数据。

与MongoDB实例交互的最简单方法是使用mongoshell。使用mongo命令打开它。

mongo

获得MongoDB提示后,使用帮助程序use创建一个名为myDatabase的新数据库。

use myDatabase
output
switched to db myDatabase

MongoDB数据库中的所有数据都应属于集合。但是,您不必显式创建集合。使用该insert方法写入不存在的集合时,将在写入数据之前自动创建集合。

您可以使用下面的代码,使用insert方法来将三个小文档添加到一个名为MyCollection的集合。

db.myCollection.insert([
    {'name': 'Alice', 'age': 30},
    {'name': 'Bill', 'age': 25},
    {'name': 'Bob', 'age': 35}
]);

如果插入成功,您将看到如下所示的消息:

BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 3,
    "nUpserted" : 0,
    "nMatched" : 0,
    "nModified" : 0,
    "nRemoved" : 0,
    "upserted" : [ ]
})

第2步 - 检查数据库的大小

现在您有一个包含数据的数据库,您可以为其创建备份。但是,如果您拥有大型数据库,备份将会很大,并且为了避免存储空间不足的风险,从而减慢或崩溃服务器,您应该在创建备份之前检查数据库的大小。

您可以使用stats方法并检查dataSize密钥的值以了解数据库的大小(以字节为单位)。

db.stats().dataSize;

对于当前数据库,dataSize的值将是一个小数字:

output
592

请注意,dataSize的值只是对备份大小的粗略估计。

第3步 - 创建备份

要创建备份,可以使用名为mongodump的命令行实用程序。默认情况下,mongodump将创建MongoDB实例中存在的所有数据库的备份。要创建特定数据库的备份,必须使用该-d选项并指定数据库的名称。此外,要让mongodump了解存储备份的位置,必须使用该-o选项并指定路径。

如果您仍在mongoshell中,请按下CTRL+D退出。

输入以下命令以创建myDatabase的备份并将其存储在~/backups/first_backup中:

mongodump -d myDatabase -o ~/backups/first_backup

如果备份创建成功,您将看到以下日志消息:

2015-11-24T18:11:58.590-0500  writing myDatabase.myCollection to /home/me/backups/first_backup/myDatabase/myCollection.bson
2015-11-24T18:11:58.591-0500  writing myDatabase.myCollection metadata to /home/me/backups/first_backup/myDatabase/myCollection.metadata.json
2015-11-24T18:11:58.592-0500  done dumping myDatabase.myCollection (3 documents)
2015-11-24T18:11:58.592-0500  writing myDatabase.system.indexes to /home/me/backups/first_backup/myDatabase/system.indexes.bson

请注意,备份不是单个文件; 它实际上是一个具有以下结构的目录:

first_backup
└── myDatabase
    ├── myCollection.bson
    ├── myCollection.metadata.json
    └── system.indexes.bson

第4步 - 删除数据库

要测试您创建的备份,您可以使用在不同服务器上运行的MongoDB实例,也可以删除当前服务器上的数据库。在本教程中,我们将执行后者。

打开mongoshell并连接到myDatabase

mongo myDatabase

使用dropDatabase`方法删除数据库。

db.dropDatabase();

如果删除成功,您将看到以下消息:

{ "dropped" : "myDatabase", "ok" : 1 }

您现在可以使用集合的方法find来查看先前插入的所有数据是否都已消失。

db.myCollection.find(); 

此命令没有输出,因为数据库中没有要显示的数据。

第5步 - 恢复数据库

要使用使用mongodump创建的备份还原数据库,可以使用另一个名为mongorestore的命令行实用程序。在使用它之前,按下CTRL+D退出mongo shell 。

使用mongorestore非常简单。它所需要的只是包含备份的目录的路径。以下是使用存储在~/backupts/first_backup位置的备份恢复数据库的方法:

mongorestore ~/backups/first_backup/

如果还原操作成功,您将看到以下日志消息:

2015-11-24T18:27:04.250-0500  building a list of dbs and collections to restore from /home/me/backups/first_backup/ dir
2015-11-24T18:27:04.251-0500  reading metadata file from /home/me/backups/first_backup/myDatabase/myCollection.metadata.json
2015-11-24T18:27:04.252-0500  restoring myDatabase.myCollection from file /home/me/backups/first_backup/myDatabase/myCollection.bson
2015-11-24T18:27:04.309-0500  restoring indexes for collection myDatabase.myCollection from metadata
2015-11-24T18:27:04.310-0500  finished restoring myDatabase.myCollection (3 documents)
2015-11-24T18:27:04.310-0500  done

要检查还原的数据,首先打开mongoshell并连接到myDatabase

mongo myDatabase

然后,在你的collection中调用find方法。

db.myCollection.find();

如果一切顺利,您现在应该能够看到之前插入的所有数据。

output
{ "_id" : ObjectId("5654e76f21299039c2ba8720"), "name" : "Alice", "age" : 30 }
{ "_id" : ObjectId("5654e76f21299039c2ba8721"), "name" : "Bill", "age" : 25 }
{ "_id" : ObjectId("5654e76f21299039c2ba8722"), "name" : "Bob", "age" : 35 }

结论

在本教程中,您学习了如何使用mongodumpmongorestore备份和还原MongoDB数据库。请注意,创建备份是一项昂贵的操作,并且可能会降低MongoDB实例的性能。因此,建议您仅在非高峰时段创建备份。

想要了解更多关于创建和使用MongoDB备份的相关教程,请前往腾讯云+社区学习更多知识。


参考文献:《How to Create and Use MongoDB Backups on Ubuntu 14.04》

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏情情说

RabbitMQ实战:性能和安全

前两篇介绍了RabbitMQ在可用性、监控方面的考虑,这是基础保障,因为在某些场景下是不容许丢失消息的,但它和性能往往是对立的,需要根据业务场景做取舍。

7208
来自专栏文渊之博

事务日志还原的次意外的操作失误

前几天新发布的一套程序发生了一次意外的操作失误,程序员修改某个表的指定范围的指定字段的时候,误操作导致更新操作没有执行where,直接引起该表指定字段全部变为更...

2109
来自专栏Laoqi's Linux运维专列

Ansible 基础搭建配置

1636
来自专栏程序员互动联盟

【专业技术】arm中的7种执行模式

嵌入式设备已经越来越与我们的日常生活密切相关了,由此带来了ARM的高速发展。就拿我们的手机来说吧,几乎所有的手机都是ARM体系的。这里大致介绍下ARM 的7种执...

3969
来自专栏java架构师

Hadoop学习6--里程碑式的开始之执行第一个程序wordcount

一、先在HDFS文件系统创建对应的目录,具体如下: 1、待处理文件存放目录  /data/wordcount(之所以创建wordcount,是为了对文件分类,对...

2726
来自专栏一个会写诗的程序员的博客

RequireJS极简入门教程RequireJS核心功能:HOW TOmain.js使用 shim

随着网站功能逐渐丰富,网页中的js也变得越来越复杂和臃肿,原有通过script标签来导入一个个的js文件这种方式已经不能满足现在互联网开发模式,我们需要团队协作...

1173
来自专栏积累沉淀

kafka学习之路(三)——高级

设计原理 kafka的设计初衷是希望作为一个统一的信息收集平台,能够实时的收集反馈信息,并需要能够支撑较大的数据量,且具备良好的容错能力. 持久性 kafka使...

2276
来自专栏lonelydawn的前端猿区

基于java swing的设备管理系统

一.系统介绍 一个简易的设备管理系统,包含了管理员登录注册、设备录入、设备状态管理功能,具体状态有购买时、正在运行、正在修理和已报废。 二.开发环境 开发环境:...

3207
来自专栏沈唁志

百度站长链接提交的js代码推送进化版

4966
来自专栏乐沙弥的世界

Percona XtraDB Cluster集群线程模型

Percona XtraDB集群创建一组线程来为其操作提供服务,这些线程与现有的MySQL线程无关。有三个主要线程组:

870

扫码关注云+社区

领取腾讯云代金券