![](/img/trans.png)
[英]in mongodb is it possible to backup and restore a specific collection in database?
[英]Backup/Restore Collection in Parts
我目前正在使用AWS EC2服务器,并且抓取了一些存储在MongoDB集合中的数据。 这是我数据库中的唯一集合。
现在,我需要将此集合转移到我的本地计算机上进行处理。 我的问题是我在远程计算机上的剩余磁盘空间不足以转储整个集合。 有大约60%的收藏空间。 我尝试使用主机名直接使用db.copy()
和db.export()
在我的本地计算机上进行复制,但是由于我不在本地网络上并且即使在一条ssh隧道。
我想做的是将我的大收藏夹分成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
(在.skip()
),您可以通过在mongo shell中应用.skip()
和.limit()
来检索它:
db.sample.find().sort({ "_id": 1 }).skip(1).limit(1)
那只是返回文档:
{ "_id" : ObjectId("560e4a5ca1a451fc8a370580"), "list" : [ 1, 2 ] }
这是通过将n-1
文档跳过到要在此批次中导出的编号,然后仅输出最后一个文档来完成的。
然后,已发行的mongodump
将包含$lte
的范围选择器,以达到该点:
mongodump -d test -c sample \
--query '{ "_id": { "$lte": { "$oid": "560e4a5ca1a451fc8a370580" } } }' \
--out part1
注意查询中的$oid
。 mongodump
和mongoimport
工具都使用MongoDB Extended JSON中描述的“严格”形式。 可用于外壳程序的辅助构造函数(例如ObjectId()
不是“严格地JSON”,而mongodump
(或带有--query
选项的任何东西)之类的工具仅使用JSON作为输入,因此此类数据以这种形式表示。
对于下一点,您希望获得可以放入转储中的下n
文档。 因此,您可以通过跳过已经输出的n
文档以及到下一个截止点n-1
的文档数来查询下一个文档截止点,或者基本上( 2 + 2 -1 ) = 3
:
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" : [ ] }
然后对转储应用另一个范围查询,但是这次使用$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
,但是您应用它,数据将很高兴地重建集合,即使是部分也是如此。 一般行为被标记为“仅插入” ,因此不同的还原将“添加”到集合中,但绝不会“覆盖”具有相同_id
值的数据。
仔细查看选项。 特别是,如果您的主机系统都在EC2上,甚至都在通用云资源中,那么就没有理由不将输出从一个管道直接传递到另一个管道。 所需要做的就是最多在允许的主机之间进行一点防火墙配置。
但是,无论如何,如果您只想备份“部分”数据,那么通常这就是进行备份的方法。
当然,根据您自己的设置和身份验证需求,这两个命令可能都需要此处显示的其他选项。 这里的选项仅是“必需”选项,以便从“数据库”中指定“集合”并使用“查询”进行过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.