介绍
如今,许多现代 Web 应用程序开发人员选择在他们的项目中使用 NoSQL 数据库,而 MongoDB 通常是他们的首选。 如果您在生产场景中使用 MongoDB,请务必定期创建备份以避免数据丢失。 幸运的是,MongoDB 提供了简单的命令行工具来创建和使用备份。 本教程将解释如何使用这些工具。
要了解如何在不篡改现有数据库的情况下进行备份,本教程将首先引导您创建一个新数据库并向其中添加少量数据。 然后,您将创建数据库的备份,然后删除数据库并使用备份恢复它。
先决条件
要继续进行,您将需要:
- 一个带有 sudo 非 root 用户 的 64 位 Ubuntu 14.04 Droplet
- MongoDB 3.0.7 安装在您的服务器上,您可以按照 this 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 }
结论
在本教程中,您学习了如何使用 mongodump
和 mongorestore
来备份和恢复 MongoDB 数据库。 请注意,创建备份是一项昂贵的操作,并且会降低 MongoDB 实例的性能。 因此,建议您仅在非高峰时段创建备份。
了解更多MongoDB备份策略,可以参考【X68X】MongoDB 3.0手册【X90X】。