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

本文涉及的产品
云数据库 MongoDB,通用型 2核4GB
简介: 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
相关文章
|
9天前
|
存储 NoSQL 关系型数据库
MongoDB 的数据关系
MongoDB是面向文档的NoSQL数据库,以其灵活的数据模型区别于传统关系型数据库。数据以JSON-like文档形式存储,文档可嵌套并存储在集合中。其特点包括:嵌入式文档、弱类型架构(无模式)、无连接性及引用关系。MongoDB支持动态添加字段,通过嵌入或引用处理文档关联,适应各种数据结构和复杂关系,适合不同应用场景。
|
18天前
|
NoSQL MongoDB
MongoDB数据日期显示相差8小时
MongoDB数据日期显示相差8小时
12 0
|
2月前
|
JSON NoSQL MongoDB
mongoDB数据的导出导入
mongoDB数据的导出导入
|
7月前
|
NoSQL 安全 关系型数据库
如何在短时间内完成MongoDB差异数据对比
NineData提供高效、安全、准确的MongoDB数据对比解决方案。它支持多种使用场景下的对比功能,包括一次性对比、周期性对比、全量数据对比和快速对比。NineData还提供简单易用的SaaS平台和可视化界面,以直观的图表和报告呈现对比结果。此外,NineData具备强劲的性能和稳定性,通过智能数据分片、批量混检和抽样检查等核心技术实现对比任务的高效运行。用户可以免费使用NineData的数据对比功能,并且平台通过高等级的安全认证保护企业的信息安全。
182 1
|
4月前
|
NoSQL MongoDB 数据库
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
MongoDB【部署 03】Windows系统安装mongodb并设置用户名密码(无需安装mongosh)及SpringBoot集成报错 Command failed with error 18
133 0
|
4月前
|
NoSQL 数据管理 分布式数据库
阿里云数据库MongoDB版助力掌阅平滑上云,撬动数据红利
随着互联网行业格局的逐步成型以及数字阅读行业的市场竞争日益激烈,掌阅将与阿里云和MongoDB继续深度合作,变现技术红利,继续深化存量用户精细化运营和加大增量用户贡献。
阿里云数据库MongoDB版助力掌阅平滑上云,撬动数据红利
|
4月前
|
存储 人工智能 NoSQL
多维数据实时分析,MongoDB给零售企业提供快速高效的数据洞察力
客户行为正在迅速演变,供应链正在重组,员工也正在以新的方式工作。企业需要提供更加个性化的客户体验,对市场趋势做出更快速的反应,监测和预防潜在问题。
多维数据实时分析,MongoDB给零售企业提供快速高效的数据洞察力
|
5月前
|
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
124 0
|
5月前
|
SQL NoSQL MongoDB
06 MongoDB - 数据操作
06 MongoDB - 数据操作
20 0
|
7月前
|
数据采集 NoSQL 容灾
如何实现MongoDB数据的快速迁移?
为解决用户面临的 MongoDB 迁移问题,玖章算术旗下的云原生智能数据管理平台 NineData 推出了 MongoDB 业务不停服数据迁移能力。NineData 实现了完全自动化的全量数据迁移,以及增量数据的采集复制能力。