mongodb通过oplog还原数据及Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps...解决方法

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: mongodb通过oplog进行还原数据,以及期间遇到的一些问题

一、配置环境

在192.168.3.71的虚机上搭建一主两从复制环境。

1、mongdb基本信息

①版本:3.2.8
②端口:
Primary:28010
Secondary:28011、28012

2、目录信息

Primary Secondary Secondary
DATA /data/mongodb1/data /data/mongodb2/data /data/mongodb3/data
LOG /data/mongodb1/log /data/mongodb2/log /data/mongodb3/log
KEY /data/mongodb1/key /data/mongodb2/key /data/mongodb3/key

二、测试

测试通过oplog指定时间点恢复和全量恢复,同时观察从库上数据的变化,下面记录了成功和失败的两次测试结果。

1、在主从初始化完成后,在主库上插入数据测试(未成功)

①插入数据

rs1:PRIMARY> use wr
rs1:PRIMARY> db.createCollection('test1')
rs1:PRIMARY> db.createCollection('test2')
rs1:PRIMARY>for(i=0;i<=10000;i++)(db.test1.insert({id:i,name:'test',date:newDate()}))
WriteResult({ "nInserted" : 1 })
rs1:PRIMARY>for(i=0;i<1000;i++)(db.test2.insert({id:i,name:'test2',date:newDate()}))
WriteResult({ "nInserted" : 1 })

②进行全备

mongodump -uroot -proot --port 28010 --oplog -o /data/backup/full

screenshot

③再次插入数据,备份local下的oplog.rs

a、再次插入数据
rs1:PRIMARY> for(i=1000;i<=2000;i++)(db.test2.insert({id:i,name:'test2',date:new Date()}))
WriteResult({ "nInserted" : 1 })

b、备份oplog.rs
在用超级用户root备份时出错:
mongodump --port 28010 -uroot -proot -d local -c oplog.rs -o /data/backup/
2018-06-14T00:26:45.777+0800    Failed: error connecting to db server: server returned error on SASL authentication step: Authentication failed.

需要添加--authenticationDatabase admin
[mongod@mgtest full]$ mongodump -h 192.168.3.71 --port 28010 -uroot -proot --authenticationDatabase admin -d local -c oplog.rs -o /data/backup/oplog
2018-06-14T02:21:11.382+0800    writing local.oplog.rs to 
2018-06-14T02:21:11.455+0800    done dumping local.oplog.rs (11025 documents)

④在主库上进行还原

a、[mongod@mgtest full]$ mongorestore --port 28010 -uroot -proot --oplogReplay --drop /data/backup/full

screenshot

b、查看主库上数据变化

screenshot
和第一次插入数据一致

c、查看从库上数据变化

screenshot
和主库数据一致

⑤在主库还原第二次备份得oplog文件

a、mongorestore --port 28010 -uroot -proot --oplogReplay  /data/backup/oplog/local/  在直接进行还原时报错

screenshot

b、mv oplog.rs.bson oplog.bson
c、mongorestore --port 28010 -uroot -proot --oplogReplay  /data/backup/oplog/local/

screenshot

screenshot

screenshot

d、还原后查看主库上数据发现并没有还原到第二次插入数据,查看从库上也没有新增数据(和主库保持一致)

主:
screenshot
从:
screenshot
通过观察数据发现并没有还原第二次插入的数据,测试没有成功

⑥查看在mongorestore时的报错

在执行完mongorestore --port 28010 -uroot -proot --oplogReplay  /data/backup/oplog/local/后,会输出大量信息,捕捉不到开始的报错信息,后重新测试还原少量数据,发现报Failed: restore error: error applying oplog: applyOps: not authorized on admin to execute command { applyOps...

解决方法(在admin数据库中执行):
db.createRole({role:'sysadmin',roles:[], privileges:[ {resource:{anyResource:true},actions:['anyAction']}]})
db.grantRolesToUser( "root" , [ { role: "sysadmin", db: "admin" } ]) 

 ##2、第二次测试

①插入数据,进行全备

rs1:PRIMARY> for(i=0;i<10000;i++)(db.a.insert({id:i,name:'test'}))
WriteResult({ "nInserted" : 1 })

进行全备:

mongodump --port 28010 -uroot -proot --oplog -o /data/backup/full

②修改数据,备份oplog

插入数据

rs1:PRIMARY> for(i=0;i<10000;i++)(db.b.insert({id:i,name:'test'}))
WriteResult({ "nInserted" : 1 })

查看当前时间戳:

rs.status()

screenshot

再次插入数据

rs1:PRIMARY> db.a.insert({id:20001,name:'wangrui'})
WriteResult({ "nInserted" : 1 })

screenshot

③备份oplog

mongodump --port 28010 -uroot -proot --authenticationDatabase admin -d local -c oplog.rs -o /data/backup/oplog

④进行还原全备数据

mongorestore --port 28010 -uroot -proot --oplogReplay --drop /data/backup/full 

screenshot

查看数据,和第二次插入数据前一致

screenshot

⑤进行增量还原

cp oplog/local/oplog.rs.bson ./full/oplog.bson
mongorestore --port 28010 -uroot -proot --oplogReplay --oplogLimit “1529577364:135” /data/backup/full 

screenshot

查看数据,在时间戳之后的数据没有还原,其他和修改后数据一致,主从数据一致。
screenshot

screenshot

⑥不指定oplogLimit进行增量还原,看test库a中id为20001的数据是否存在

mongorestore --port 28010 -uroot -proot --oplogReplay /data/backup/full 

screenshot

查看数据,发现a中id为20001的数据已被还原

screenshot

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
相关文章
|
NoSQL MongoDB
mongodb踩坑-Error: Cannot find module 'mongoose'
mongodb踩坑-Error: Cannot find module 'mongoose'
91 0
|
5月前
|
NoSQL MongoDB Python
【Python】已完美解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart
【Python】已完美解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart
297 1
|
7月前
|
NoSQL 关系型数据库 MongoDB
实时计算 Flink版操作报错之使用mongodb cdc时报错Command failed with error 40573,是什么导致的
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
7月前
|
NoSQL MongoDB 数据库
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
575 0
|
NoSQL MongoDB
解决 :MongoDB couldn‘t add user: not authorized on ‘your db‘ to execute command
解决 :MongoDB couldn‘t add user: not authorized on ‘your db‘ to execute command
501 0
|
NoSQL MongoDB
connect-mongo无法连接到mongodb报错Error: failed to connect to [undefined:27017]
connect-mongo无法连接到mongodb报错Error: failed to connect to [undefined:27017]
|
NoSQL MongoDB PHP
Yii2使用Mongodb配置并解决SyntaxError: missing ] after element list以及Authentication failed
Yii2使用Mongodb配置并解决SyntaxError: missing ] after element list以及Authentication failed
302 0
Yii2使用Mongodb配置并解决SyntaxError: missing ] after element list以及Authentication failed
|
2月前
|
存储 关系型数据库 MySQL
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB区别,适用场景
一个项目用5款数据库?MySQL、PostgreSQL、ClickHouse、MongoDB——特点、性能、扩展性、安全性、适用场景比较
|
1月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第21天】本文探讨了MongoDB Atlas的核心特性、实践应用及对云原生数据库未来的思考。MongoDB Atlas作为MongoDB的云原生版本,提供全球分布式、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了云原生数据库的未来趋势,如架构灵活性、智能化运维和混合云支持,并分享了实施MongoDB Atlas的最佳实践。
|
2月前
|
NoSQL Cloud Native atlas
探索云原生数据库:MongoDB Atlas 的实践与思考
【10月更文挑战第20天】本文探讨了MongoDB Atlas的核心特性、实践应用及对未来云原生数据库的思考。MongoDB Atlas作为云原生数据库服务,具备全球分布、完全托管、弹性伸缩和安全合规等优势,支持快速部署、数据全球化、自动化运维和灵活定价。文章还讨论了实施MongoDB Atlas的最佳实践和职业心得,展望了云原生数据库的发展趋势。