开发者社区> rudy_gao> 正文

mongodb 2.4升级至3.2

简介: --mongorestore升级过程中如果遇到如下错误,需要删除admin数据库 [root@beta tmp]# mongorestore -h 127.
+关注继续查看
--mongorestore升级过程中如果遇到如下错误,需要删除admin数据库
[root@beta tmp]# mongorestore -h 127.0.0.1 --oplogReplay --port 27015 --dir /tmp/dump20160411/
2016-04-11T16:36:14.026+0800    building a list of dbs and collections to restore from /tmp/dump20160411 dir
2016-04-11T16:36:14.039+0800    assuming users in the dump directory are from <= 2.4 (auth version 1)
2016-04-11T16:36:14.040+0800    Failed: the users and roles collections in the dump have an incompatible auth version with target server: cannot restore users of auth version 1 to a server of auth version 5

--删除admin数据库,可以正确还原数据库从2.4至3.2
[root@beta dump20160411]# rm -rf admin/
[root@beta dump20160411]# mongorestore -h 127.0.0.1 --oplogReplay --port 27015 --dir /tmp/dump20160411/


--同样的数据在3.2版本中压缩比比在2.4中多10倍以上
[root@beta mongodb]# du -sh *
35G     27014 (2.4版本)
3.1G    27015 (3.2版本)


 --从mongo2.6开始,mongo限制索引的大小不能超过1MB(之前的版本是索引无效),否则其会报错
 Failed: messaging.messageHistory: error creating indexes for messaging.messageHistory: createIndex error: WiredTigerIndex::insert: key too large to index, failing  2001
 { : "环境后台出现错误: org.springframework.validation.BeanPropertyBindingResult: 4 errors Field error in object 'flightWhiteSearchRequirment' on fi..." }

The total size of an index entry, which can include structural overhead depending on the BSON type, must be less than 1024 bytes.
MongoDB will not create an index on a collection if the index entry for an existing document exceeds the index key limit. Previous versions of MongoDB would create the index but not index such documents.


--查看索引中字段最长的 _id
var max_id=null;
var max_title_length=1;
db.messageHistory.find().forEach(function(doc){if(doc.title.length>max_title_length) {max_title_length=doc.title.length; max_id=doc._id;} });


--此时有两种解决方法,
一是在 mongorestore 中加上 noIndexRestore 不恢复索引,注意此时意味着恢复完成后要手动对每一个数据库的每一个文档重建索引
一是在 编辑 collection.metadata.json 文件,把与那个索引有关的语句删除掉



-- 单库迁移升级(场景:原来的数据库在mongo 2.4版本中(端口27016),现在现把它迁移到3.2版本中(端口27017),在迁移升级过程中也有数据的变更)

--假设要迁移的数据库为test
--先初始化一部分数据
use test
for(var i=1;i<10000;i++) {db.user.insert({"name":"rudy"+Math.round(Math.random()*1000),"password":"123"+Math.round(Math.random()*100)}) }

--备份之前,查看此时的时间戳
Timestamp(Date.parse(new Date())/1000,1);
Timestamp(1463128620, 1)

--备份出数据
mongodump -o /tmp/backup/dump`date +%Y%m%d` -d test --port 27016

--接着做数据的变更(注意增删改等操作也可能在其它数据中进行)
for(var i=1;i<10;i++) {
var rand=Math.round(Math.random()*1000);
if(i%2==0)
  {db.user.remove({"name":"rudy"+rand})}
}


--将备份出的数据导入到3.2版本中
mongorestore -h 127.0.0.1  --port 27017  --dir /tmp/backup/dump20160516/ 

--依据导出前的时间戳,导出与数据库test有关的oplog(2.4版本),注意导出时的查询条件,以及对"."的双转义
mongodump -h 127.0.0.1 --port 27016 -d local -c "oplog.rs" -q '{"ns":/^test\\./,ts:{$gte:Timestamp(1463128620, 1)}}' -o /tmp/backup/oplog01/

--新起一个实例把oplog导出到新实例中(如果需要循环操作,从第二次起,导入前把oplog.rs清空)
mongorestore -h 127.0.0.1 --port 27019 -d local -c "oplog.rs" --dir /tmp/backup/oplog01/local/oplog.rs.bson

--把oplog导入到3.2版本的数据库中,以实现滚动的数据应用
mongooplog --host=127.0.0.1 --port 27017 --from 127.0.0.1:27019 

--循环从2.4版本导出oplog,在3.2版本中应用oplog的过程,直到应用的连接连接到3.2版本为止




(另注:由于从3.2版本开始mongooplog已经被废弃,要使用mongorestore进行oplog操作)
--由于mongorestore需要的是oplog.bson,故需要对备份出来的oplog重命名
cp /tmp/backup/oplog01/local/oplog.rs.bson /tmp/backup/oplog01/local/oplog.bson
--指定oplogReplay参数对oplog进行重放(注意此时不需要 -d local -c "oplog.rs" 参数,因为其只会把oplog导入到local数据库中,但不对oplog进行重放)
mongorestore -h 127.0.0.1 --port 27017 --oplogReplay --dir /tmp/backup/oplog01/local/

--循环从2.4版本导出oplog,在3.2版本中应用oplog的过程,直到应用的连接连接到3.2版本为止






版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【智能推荐系列公开课讲义③】智能推荐电商行业2.0发布,算法模版再升级
阿里巴巴搜索推荐产品团队带来系列公开课,聊聊怎样结合实际场景,嵌入智能推荐,搭建“千人千面”的分发体系,使产品价值最大化。每期20分钟,10课时,修炼推荐硬功夫。
1938 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
19736 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13765 0
【阿里云资讯】最前沿人工智能,助力双11搜索推荐技术再升级——深度增强学习大规模在线应用
11月12日消息,天猫“双11”销售额6分58秒破百亿;前30分钟内交易峰值17.5万笔/秒,支付峰值12万笔/秒,24小时实现销售额1207亿元。用户更快、更准购物体验来自于搜索和推荐的数据智能的提升。
3237 0
阿里云服务器端口号设置
阿里云服务器初级使用者可能面临的问题之一. 使用tomcat或者其他服务器软件设置端口号后,比如 一些不是默认的, mysql的 3306, mssql的1433,有时候打不开网页, 原因是没有在ecs安全组去设置这个端口号. 解决: 点击ecs下网络和安全下的安全组 在弹出的安全组中,如果没有就新建安全组,然后点击配置规则 最后如上图点击添加...或快速创建.   have fun!  将编程看作是一门艺术,而不单单是个技术。
18005 0
mongodb 2.4升级至3.2
--mongorestore升级过程中如果遇到如下错误,需要删除admin数据库 [root@beta tmp]# mongorestore -h 127.
1206 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
24812 0
+关注
486
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
OceanBase 入门到实战教程
立即下载
阿里云图数据库GDB,加速开启“图智”未来.ppt
立即下载
实时数仓Hologres技术实战一本通2.0版(下)
立即下载