如何在Ubuntu14.04上创建和使用MongoDB备份

来自菜鸟教程
跳转至:导航、​搜索

介绍

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

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

先决条件

要继续进行,您将需要:

第 1 步 — 创建示例数据库

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

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

mongo

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

use myDatabase

输出

switched to db myDatabase

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

您可以使用以下代码使用 insert 方法将三个小文档添加到名为 myCollection 的集合中:

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

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

成功的 insert() 操作的输出

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

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

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

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

db.stats().dataSize;

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

db.stats().datasize 的输出

592

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

第 3 步 — 创建备份

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

如果您仍在 mongo 外壳中,请按 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

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

MongoDB备份的目录结构

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

第 4 步 — 删除数据库

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

打开 mongo shell 并连接到 myDatabase

mongo myDatabase

使用dropDatabase方法删除数据库。

db.dropDatabase();

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

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

要检查恢复的数据,首先,打开 mongo shell 并连接到 myDatabase

mongo myDatabase

然后,在 collection 上调用 find 方法。

db.myCollection.find();

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

find() 的输出

{ "_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备份策略,可以参考【X68X】MongoDB 3.0手册【X90X】。