Mongodb中使用db.collection.copyTo()方法遇到的坑,请慎用!

Mongodb使用知识点记录 专栏收录该内容
24 篇文章 20 订阅

前几天,在工作中遇到一个需求,需要将一个集合复制一份并且在复制后的集合上进行一些后处理,当时同事使用脚本进行的处理,先使用db.collection.copyTo()进行复制集合,然后在js脚本中遍历新集合中的记录,查询出需要处理的记录并进行相应更新处理。


可是当时在现网执行的时候却出现了问题,在执行db.collection.copyTo()这个命令的时候,现网出现了频繁的告警(后台做的对业务接口调用的功能监控),一些功能直接无法使用!到底是什么原因呢?


后来我们查看了官网对db.collection.copyTo()这个方法的说明,原来我们踩到了地雷了,我们当时使用的Mongodb版本是3.0版本,查看3.0版本的这个方法的说明,发现这个方法在3.0版本已经被废弃了,已经不建议使用了。具体看了下,原来这个方法在执行的时候,会使用一个全局锁(什么是全局锁呢?就是你在执行过程中的,所有的对这个mongodb实例服务的读写操作都会被拒绝,多么坑爹的一个玩意),这就导致了后来我们的一些接口在调用这个实例上的数据查询服务时都遇到了异常。


当时看了下我们的库中的数据量,一百万条左右,当时直接导致现网故障时间就达两分钟,可想而知,要是当时数据库中的数据量再大点,那多占用多长的时间!!!


因此,以后在拷贝集合的时候尽量不要使用这个方法了。可以考虑一下mongoexport和mongoimport,或者mongosync。如果在拷贝的过程中还需要做一些逻辑处理,还可以写代码循环遍历集合中的数据,然后再插入到新集合中,这样就不会有任何问题了。


  • 1
    点赞
  • 1
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 程序猿惹谁了 设计师:白松林 返回首页

打赏

DreamMakers

您的肯定是我坚持的最大动力。

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值