MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)

栏目: 数据库 · 发布时间: 7年前

内容简介:今天在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: {

一. 背景

今天在 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" }

具体的错误截图如下:

MongoDB在已有账号的实例下还原数据库报错的分析(error applying oplog)

从这个图中可以看出,正常的完整备份已恢复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数据库的账号还原。

本文版权归作者所有,未经作者同意不得转载 , 谢谢配合!!!


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Distributed Systems

Distributed Systems

Sukumar Ghosh / Chapman and Hall/CRC / 2014-7-14 / USD 119.95

Distributed Systems: An Algorithmic Approach, Second Edition provides a balanced and straightforward treatment of the underlying theory and practical applications of distributed computing. As in the p......一起来看看 《Distributed Systems》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

MD5 加密
MD5 加密

MD5 加密工具

html转js在线工具
html转js在线工具

html转js在线工具