MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)
一. 背景
今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错。
主要错误为:
Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps: [ { ts: Timestamp(1548004840, 1), h: 1234878425364100170, v: 2, op: "u", ns: "config.system.sessions", o: { $v: 1, $set: { lastUse: new Date(1548004840930) } }, o2: { _id: { id: UUID("375d7607-1a37-46ff-969d-76cba89ecd1d"), uid: BinData(0, A6653754954E376BB727538E13AB142D86A1278B7DD827C77241907FB377D777) } } } ], $db: "admin" }
具体的错误截图如下:

从这个图中可以看出,正常的完整备份已恢复OK,只是在恢复备份过程中产生的oplog的备份时报错,replaying oplog产生Error。
MongoDB oplog的相关知识可参照 博客 https://www.cnblogs.com/xuliuzai/p/9832333.html 和 https://www.cnblogs.com/xuliuzai/p/9917137.html 上相关介绍。
二 . 错误分析
从报错信息 :not authorized on admin to execute command ,可以初步判断是账号权限的问题。
回头看下,检查下我们的新MongoDB实例的设置,已在还原实例上设置了 root 权限的账号,并且 登入验证,账号是没有问题的。
执行的还原命令 也是用的root权限的账号,也是没有问题的啊。
这就很奇怪!印象中,在之前的版本中没有遇到过类似的错误。
这时想到去查看mongodb的运行log,说不定有相关的错误信息。
在log中,发现紧挨着 这个报错信息的地方还有一个错误 信息
2019-01-21T14:45:03.076+0800 W ACCESS [conn7] Could not insert user testroot@admin in _mergeAuthzCollections command: DuplicateKey: User "testroot@admin" already exists。
而log错误信息中的testroot正是我们 在 还原实例 和代还原实例上都拥有root角色权限的账号。
所以,问题基本可以定位到了:就是还原实例上已经有了testroot账号,所以在还原admin 数据库时,还原库上的testroot账号insert不进来,而还原oplog备份需要原来的账号信息。
怎么验证这个推断是否正确呢?最直接的办法就是 将还原数据库所在的实例设置为免密登入,再进行验证即可:
step 1 ,将新实例(还原的实例)服务关闭;
step 2,将mongodb 下的数据文件删除 ,logs文件保留。
step 3,将conf 配置文件中auth=true 注释掉
step 4,重启mongodb服务。
在此执行还原,执行OK,不再报错。
2019-01-21T16:15:00.234+0800 replaying oplog
......
2019-01-21T16:15:00.364+0800 done
注意:在完整还原的基础上,再逐一还原oplog时也会报类似错误(即增量备份还原也有类似错误),所以建议数据库完全还原完后再设置登入验证。
三 .解决方案
方案1. 如上文的测试一样,将新的MongoDB实例设置为免密登入,恢复后马上设置验证登入,即配置文件中添加auth=true,然后,重启服务(推荐,但还原后一定要设置密码方式登入。)。
方案2. 待还原的实例和新的实例,两者的root权限的账户不要命名一样,这样也可以避免 DuplicateKey,影响admin数据库的账号还原。
本文版权归作者所有,未经作者同意不得转载,谢谢配合!!!
MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)的更多相关文章
- windows下oracle数据库报错ORA-12705解决方法
转自:http://blog.sina.com.cn/s/blog_16eaf6b940102x66q.html 有个朋友,他们那边windows虚拟机重启后,数据库不能起来报错ORA-12705无法 ...
- Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use
今天在别人的服务器上登录mysql发现无法登陆(Mysql别人实现安装好的) 密码和用户名都是正确的,但登录后报如下错误: ERROR 1045 (28000): Access denied for ...
- 在cmd下import cv2报错——OpenCV实现BRISK
平台:win10 x64 +JetBrains PyCharm 2018.2.4 x64 +Anaconda3(python3.7.0+opencv3.4.5) Issue说明:同学发了个python ...
- 【转】Eclipse下启动tomcat报错:/bin/bootstrap.jar which is referenced by the classpath, does not exist.
转载地址:http://blog.csdn.net/jnqqls/article/details/8946964 1.错误: 在Eclipse下启动tomcat的时候,报错为:Eclipse下启动to ...
- [转]解决IIS下UTF-8文件报错乱码的问题
找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后 ...
- [原创] ubuntu下安装scrapy报错 error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
Ubuntu14.04在virtualenv下安装scrapy报错,Failed building wheel for cffi,lxml,cryptography 等. error: command ...
- mac下brew install 报错
mac下brew install 报错 错误提示: 原因:是这个brew的权限不正确 修改一下这个brew的权限 chown root:wheel /usr/local/bin/brew
- Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例
Linux下Oracle11G RAC报错:在安装oracle软件时报file notfound一例 1.现象 之前安装一切都比較顺利,安装oracle软件时,进度到30%时报错:file not f ...
- Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with
Linux系统下启动MySQL报错:Neither host 'localhost.localdomain' nor 'localhost' could be looked up with 摘要 Li ...
随机推荐
- [Swift]LeetCode925. 长按键入 | Long Pressed Name
Your friend is typing his name into a keyboard. Sometimes, when typing a character c, the key might ...
- Java中构造方法、实例方法、类方法的区别
1. 构造方法 构造方法负责对象的初始化工作,为实例变量赋予合适的初始值.必须满足以下的语法规则: 方法名与类名相同: 不要返回类型(例如return.void等): 不能被static.final. ...
- 初始Oracle
1.Oracle简介 Oracle体系结构: 先是用户进程发起一个请求到服务器进程(PGA , 一个PGA对应一个请求),然后PGA在发送给SGA.SGA有三大块分别是:共享池,数据缓冲区,日志缓 ...
- Python Django(WEB电商项目构建)
(坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...
- 【Spark篇】---Spark初始
一.前述 Spark是基于内存的计算框架,性能要优于Mapreduce,可以实现hadoop生态圈中的多个组件,是一个非常优秀的大数据框架,是Apache的顶级项目.One stack rule ...
- npm私有仓库 配置verdaccio在docker环境
前端开发过程中,少不了自己封装一些通用的包,但又不想放在公共的平台,所以搭建一个npm私有的仓库是很有必要的. 在这里简单介绍如何使用 verdoccio 在docker环境下的配置.verdocci ...
- 「造个轮子」——cicada(轻量级 WEB 框架)
前言 俗话说 「不要重复造轮子」,关于是否有必要不再本次讨论范围. 创建这个项目的主要目的还是提升自己,看看和知名类开源项目的差距以及学习优秀的开源方式. 好了,现在着重来谈谈 cicada 这个项目 ...
- 大数据技术之_19_Spark学习_01_Spark 基础解析 + Spark 概述 + Spark 集群安装 + 执行 Spark 程序
第1章 Spark 概述1.1 什么是 Spark1.2 Spark 特点1.3 Spark 的用户和用途第2章 Spark 集群安装2.1 集群角色2.2 机器准备2.3 下载 Spark 安装包2 ...
- Docker最全教程——从理论到实战(七)
在本系列教程中,笔者希望将必要的知识点围绕理论.流程(工作流程).方法.实践来进行讲解,而不是单纯的为讲解知识点而进行讲解.也就是说,笔者希望能够让大家将理论.知识.思想和指导应用到工作的实际场景和实 ...
- spring原理案例-基本项目搭建 03 创建工程运行测试 spring ioc原理实例示例
下面开始项目的搭建 使用 Java EE - Eclipse 新建一 Dynamic Web Project Target Runtime 选 Apache Tomcat 7.0(不要选 Apache ...