**副本集状态出现RECOVERING**

mongo副本集搭建完成后从节点出现RECOVERING状态:
test:RECOVERING>
1.查看mongo的日志一直在报错复制错误的信息:
MongoDB故障总结_第1张图片
2.从节点登录查看复制状态信息:很明显是在前天下午18点30的时候复制停止,找到原因是因为关机前没关虚拟机,导致mongo异常退出,复制失败
MongoDB故障总结_第2张图片
3.上网搜了一下资料,需要手动同步数据,mongo官网给了两种办法
1) 自动同步,最简单也是操作最少的一种办法,先把mongodb停止服务,然后把mongodb的数据目录移走,新建一个mongo的数据目录,再起服务,这样他就会自动去追赶主库的数据,缺点是恢复时间比较久,根据数据量来决定
2) 从另外一个成员拷贝数据文件, 停止备库,从primary库copy数据文件,在copy的时候,注意要把local库也复制过来,复制不能采用mongodump,仅仅只允许使用快照备份数据文件
分析了上面的2种方式,第一种方式,清空数据目录重启mongodb实例让mongodb初始化同步数据,操作简单,但是恢复时间比较长,需要花费更多时间替换数据,第二种方式从副本集合的另外一个成员拷贝数据目录后重启mongodb实例,这个恢复过程速度快但是需要比较多的手工操作步骤,为了方便和简单,我这里用第一种方式
故障节点再此之前先把mongodb的服务给停了,进去mongo里use admin库再输入db.shutdownServer()
MongoDB故障总结_第3张图片
4、我的mongo的数据放在这个文件夹里,现在把原来的数据改个名字 新建一个mongo的数据文件夹,要知道自己的数据文件夹放哪里可以看/etc/mongod.conf文件
root@backup:/data # mv mongo mongo.bak #给旧的mongo数据文件进行改名
查看一下新文件夹, mongodb副本集已经在向主节点同步数据了
root@backup:/data # mkdir mongo #创建新的mongo文件夹
MongoDB故障总结_第4张图片
rset:STARTUP2> rs.status(); #查看一下集群信息
发现刚才重启的这台状态已经变成startup2了,接下来的就是等待了
等了大概一天同步数据,登上去看看
rset:PRIMARY> rs.status()

发现这个节点的数据已经恢复了,并加入了集群里,其他的副本集如果也是RECOVERING也要做相同的操作,总的来说就是停止服务,然后移走老的数据文件夹,新建新的文件夹,再起服务等他自己同步,把oplog调整大一点,防止以后又出现这种情况
测试是否同步成功:去主节点插入一条数据在从节点查看复制状态:

部分摘自51cto