一. 背景

今天在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)的更多相关文章

  1. windows下oracle数据库报错ORA-12705解决方法

    转自:http://blog.sina.com.cn/s/blog_16eaf6b940102x66q.html 有个朋友,他们那边windows虚拟机重启后,数据库不能起来报错ORA-12705无法 ...

  2. Linux 下,mysql数据库报无法登陆错误:ERROR 1045 (28000): Access denied for use

    今天在别人的服务器上登录mysql发现无法登陆(Mysql别人实现安装好的) 密码和用户名都是正确的,但登录后报如下错误: ERROR 1045 (28000): Access denied for ...

  3. 在cmd下import cv2报错——OpenCV实现BRISK

    平台:win10 x64 +JetBrains PyCharm 2018.2.4 x64 +Anaconda3(python3.7.0+opencv3.4.5) Issue说明:同学发了个python ...

  4. 【转】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 ...

  5. [转]解决IIS下UTF-8文件报错乱码的问题

    找了两天才找到解决办法…….晕晕晕...用第二种方法解决了. 网上找到的方法都没有写这一条 If objASPError.ASPDescription > "" Then 后 ...

  6. [原创] 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 ...

  7. mac下brew install 报错

    mac下brew install 报错 错误提示: 原因:是这个brew的权限不正确 修改一下这个brew的权限 chown root:wheel /usr/local/bin/brew

  8. Linux下Oracle11G RAC报错:在安装oracle软件时报file not found一例

    Linux下Oracle11G RAC报错:在安装oracle软件时报file notfound一例 1.现象 之前安装一切都比較顺利,安装oracle软件时,进度到30%时报错:file not f ...

  9. 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 ...

随机推荐

  1. [Swift]LeetCode476. 数字的补数 | Number Complement

    Given a positive integer, output its complement number. The complement strategy is to flip the bits ...

  2. Ubuntu12.04中的虚拟机安装Ubuntu16.04,并实现远程控制16.04

    目录 1.设置网络连接 1.1 VMware虚拟机网络地址设置 1.2 设置虚拟机内Ubuntu16.04的网络模式 未开机状态下 开机状态下 1.3 查看虚拟机中Ubuntu16.04的IP 2.进 ...

  3. BBS论坛(三十三)

    33.celery实现邮件异步发送 (1)task.py pip install celery redis from celery import Celery from flask import Fl ...

  4. 高可用Eureka注册中心配置说明(双机部署)

    目  录 1. 高可用EureKa注册中心示意图 2. Eureka实例相互注册配置 3. 微服务注册到Eureka配置 4. 启动步骤及配置成功检查 5. 说明事项 1. 高可用EureKa注册中心 ...

  5. Object Pooling(对象池)实现

    在文章开始之前首先要思考的问题是为什么要建立对象池.这和.NET垃圾回收机制有关,正如下面引用所说,内存不是无限的,垃圾回收器最终要回收对象,释放内存.尽管.NET为垃圾回收已经进行了大量优化,例如将 ...

  6. NIO 简介

    上文我们描述了五中IO类型.第一种同步阻塞模型我们我们称之为BIO(Blocking IO), 第三种IO复用模型我们称之为NIO(Nonblocking IO). 上图我们可以很容易的发现 BIO会 ...

  7. JVM(1)---虚拟机在运行期的优化策略

    1.解释器与JIT编译器 首先我们先来了解一下运行在虚拟机之上的解释器与JIT编译器.当我们的虚拟机在运行一个java程序的时候,它可以采用两种方式来运行这个java程序: 采用解释器的形式,也就是说 ...

  8. 大数据技术之_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 ...

  9. springboot情操陶冶-web配置(五)

    本文讲讲mvc的异常处理机制,方便查阅以及编写合理的异常响应方式 入口例子 很简单,根据之前的文章,我们只需要复写WebMvcConfigurer接口的异常添加方法即可,如下 1.创建简单的异常处理类 ...

  10. javascript小实例,拖拽应用(一)

    前面我们将了一下拖拽的基本思想,理论是有了,那实践呢,可以运用到什么地方呢?下面就给大家带来一个用拖拽思想写的一个小实例,供大家参考,大致效果看下图: 就是这样一个简单的一个拖拽条,你可以把它理解为滚 ...