Mongodb中使用db.collection.copyTo()方法遇到的坑,请慎用!
2017-06-24 10:00
615 查看
前几天,在工作中遇到一个需求,需要将一个集合复制一份并且在复制后的集合上进行一些后处理,当时同事使用脚本进行的处理,先使用
可是当时在现网执行的时候却出现了问题,在执行
后来我们查看了官网对
当时看了下我们的库中的数据量,一百万条左右,当时直接导致现网故障时间就达两分钟,可想而知,要是当时数据库中的数据量再大点,那多占用多长的时间!!!
因此,以后在拷贝集合的时候尽量不要使用这个方法了。可以考虑一下mongoexport和mongoimport,或者mongosync。如果在拷贝的过程中还需要做一些逻辑处理,还可以写代码循环遍历集合中的数据,然后再插入到新集合中,这样就不会有任何问题了。
db.collection.copyTo()进行复制集合,然后在js脚本中遍历新集合中的记录,查询出需要处理的记录并进行相应更新处理。
可是当时在现网执行的时候却出现了问题,在执行
db.collection.copyTo()这个命令的时候,现网出现了频繁的告警(后台做的对业务接口调用的功能监控),一些功能直接无法使用!到底是什么原因呢?
后来我们查看了官网对
db.collection.copyTo()这个方法的说明,原来我们踩到了地雷了,我们当时使用的Mongodb版本是3.0版本,查看3.0版本的这个方法的说明,发现这个方法在3.0版本已经被废弃了,已经不建议使用了。具体看了下,原来这个方法在执行的时候,会使用一个全局锁(什么是全局锁呢?就是你在执行过程中的,所有的对这个mongodb实例服务的读写操作都会被拒绝,多么坑爹的一个玩意),这就导致了后来我们的一些接口在调用这个实例上的数据查询服务时都遇到了异常。
当时看了下我们的库中的数据量,一百万条左右,当时直接导致现网故障时间就达两分钟,可想而知,要是当时数据库中的数据量再大点,那多占用多长的时间!!!
因此,以后在拷贝集合的时候尽量不要使用这个方法了。可以考虑一下mongoexport和mongoimport,或者mongosync。如果在拷贝的过程中还需要做一些逻辑处理,还可以写代码循环遍历集合中的数据,然后再插入到新集合中,这样就不会有任何问题了。
相关文章推荐
- MongoDB帮助信息:db方法,collection方法
- mongodb 用户身份验证,权限控制db.createUser()方法使用
- MongoDB常用操作一查询find方法db.collection_name.find()
- MongoDB 3.0 集合方法 db.collection.explain()
- 使用Spring提供的BeanUtils.copyProperties()方法报错:Could not copy property 'xxx' from source to target
- 使用download smartforms to xml的方法copy越南语
- MongoDB常用操作一查询find方法db.collection_name.find()
- 使用JAVA向MongoDB中插入数据时报错The method insert(DBObject[]) in the type DBCollection is not applicable
- 使用ActionBar,调整Theme时遇到You need to use a Theme.AppCompat theme (or descendant) with this activity解决方法
- J2ME使用WTK模拟器开发时候遇到“OK to use Airtime” 问题的解决方法
- 使用WinDbg调试Silverlight中遇到“Failed to find runtime DLL (clr.dll), 0x80004005”问题的解决方法之一
- mongodb停止遇到shutdownServer failed: unauthorized: this command must run from localhost when running db without auth解决方法
- Delphi使用BDE连接远程MS SQL SERVER 2000数据库时出现“Db-library network communciations layer not loaded.”错误的解决方法
- 使用window.open()方法时遇到的问题
- 在LINQ to SQL中使用Translate方法以及修改查询用SQL 推荐
- Linq to SQL Delete时遇到问题的解决方法
- Linq to SQL Delete时遇到问题的解决方法
- 关于在使用rowid和rownum时遇到ORA-01446错误的原因即解决方法。
- 使用pbrt 1.03遇到的问题和解决方法
- 使用hibernate,在面对复杂业务处理的时候,你是否很顺手,由Exception-found shared references to a collection说开去