欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2023-02-20 22:29:57
一. 背景 今天在MongoDB 4.0.4版本下,在还原恢复数据库时报错。 主要错误为: Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { appl ......

一. 背景

今天在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 oplo*生error。

mongodb oplog的相关知识可参照 博客    和   上相关介绍。

二 . 错误分析

从报错信息 :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数据库的账号还原。

 

 

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