部件中的备份/恢复集合

时间:2016-02-27 07:45:56

标签: mongodb amazon-ec2

我目前正在使用AWS EC2服务器,并且我删除了存储在MongoDB集合中的一些数据。这是我数据库中唯一的集合。

现在我需要将此集合传输到本地计算机以进行处理。我的问题是我的远程机器上剩余的磁盘空间不足以转储整个集合。大约60%的收藏品有空间。 我尝试使用[a, c, d, e] db.copy()使用主机名直接复制到我的本地计算机上,但它不起作用,因为我不在本地网络上而且我有一些身份验证问题,即使是ssh隧道。

我想做的是将我的大集合分成两个较小的集合并转储它们。有可能吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

您最好的选择是使用mongodump来收集部分内容。对于"批量迁移而言,这也是最好的事情。如果您可以更改主机之间的网络设置以允许此操作,则数据的使用部分可以应用于直接在主机之间工作。

如果您只需要在集合的一部分上使用mongodump,那么一般情况是应用--query选项来选择输出。没有"限制"输出的修饰符,所以你需要应用"范围查询"运算符,分别为$lte$gt

作为一个简单的示例集,请考虑以下数据:

{ "_id" : ObjectId("560e4a56a1a451fc8a37057f"), "list" : [ 1, 2, 3 ] }
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
{ "_id" : ObjectId("560e4a62a1a451fc8a370581"), "list" : [ 1 ] }
{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

因此,我们的想法是在"切割点获得_id值"您想要并构建范围查询以仅选择这些范围内的文档。对于这个例子,我们将输出分成两组。

所以你想要的第一件事是第二个文件的_id(两个人),你可以通过在mongo shell中应用.skip().limit()来检索:

db.sample.find().sort({ "_id": 1 }).skip(1).limit(1)

这只是要返回文件:

{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }

通过将n-1个文档跳过到您要在此批次中导出的数字,然后输出最后一个文档来完成。

issed mongodump将包含$lte的范围选择器,直到达到这一点:

mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1

请注意查询中的$oidmongodumpmongoimport工具都使用"strict"中描述的MongoDB Extended JSON表单。 shell可用的ObjectId()之类的辅助构造函数不是严格的JSON",mongodump之类的工具(或任何带有--query选项的工具)只使用JSON作为输入,所以这样的数据就是用这种形式表示的。

下一步,您希望获得可以放入转储的下一个n文档。因此,您希望通过跳过已输出的n文档加上下一个截止点n-1或基本上( 2 + 2 -1 ) = 3的文档数来查询下一个文档截止值:< / p>

db.sample.find().sort({ "_id": 1 }).skip(3).limit(1)

或者更好的是,应用上次截止时$gt的范围:

db.sample.find({ "_id": { "$gt": ObjectId("560e4a5ca1a451fc8a370580") }}).skip(1).limit(1)

无论哪种方式都可以获得下一个截止文件:

{ "_id" : ObjectId("560e4a6ca1a451fc8a370582"), "list" : [ ] }

然后在转储上应用另一个范围查询,但这次使用&#34;两者&#34; $gt$lte运营商:

mongodump -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out part2

与每个部分一样,您可以根据需要获取数据并将其移动到目标主机。请注意,在此表单中--out指定文件所在的目录

请注意,这里有一些选项可以提供帮助,例如:

--host - (理想情况下来自mongorestore)这可以让您在另一个系统上运行整个过程。例如,您可以在新的目标MongoDB实例中运行以下命令,将数据从源主机直接传送到该系统上的mongorestore

mongodump --host orighost -d test -c sample \
--query '{ "_id": { 
    "$gt": { "$oid": "560e4a5ca1a451fc8a370580" },
    "$lte": { "$oid": "560e4a6ca1a451fc8a370582" } }}' \
--out - \
| mongorestore -d newtest -c newsample --dir -

注意-分别表示每个命令的标准输出/输入。

--gzip - 如果您在两台主机上都安装了MongoDB 3.2,那么您也可以利用此选项压缩/解压缩数据输出或流,如上面的管道中所示。结合该管道选项,这将是将数据迁移到新目标主机的最有效方式。

对于mongorestore一般来说,无论你应用它,数据都会很乐意重建集合,即使是部分也是如此。一般行为标记为"Insert Only",因此不同的恢复将&#34;添加&#34;到集合但从未&#34;覆盖&#34; 具有相同_id值的数据。

仔细查看选项。特别是如果你的主机系统都在EC2上,或者甚至都在一般的云资源中,那么你真的应该没有理由不能将输出从一个直接传输到另一个。所需要的只是允许主机之间最多的防火墙配置。

但无论如何,你只想备份&#34;部分&#34;数据,这通常是做这件事的方式。

当然,根据您自己的设置和身份验证需求,这两个命令可能需要除此处演示的选项之外的其他选项。这里的选项只是&#34; required&#34;选项以指定&#34;集合&#34;来自&#34;数据库&#34;并使用&#34;查询&#34;过滤。