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
相关文章
|
22天前
|
SQL NoSQL 数据管理
数据管理DMS使用问题之如何批量导入MongoDB的数据文件
阿里云数据管理DMS提供了全面的数据管理、数据库运维、数据安全、数据迁移与同步等功能,助力企业高效、安全地进行数据库管理和运维工作。以下是DMS产品使用合集的详细介绍。
|
1月前
|
NoSQL MongoDB Python
【Python】已完美解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart
【Python】已完美解决(MongoDB安装报错)Service ‘MongoDB Server (MongoDB)’ (MongoDB) failed tostart
54 1
|
2月前
|
SQL DataWorks NoSQL
DataWorks产品使用合集之如何将SQL Server中的数据转存到MongoDB
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
261 1
|
7天前
|
监控 NoSQL MongoDB
mongodb查询100万数据如何查询快速
综上,提高MongoDB百万级数据的查询性能需要综合多项技术,并在实际应用中不断调优和实践。理解数据的特征,合理设计索引,优化查询语句,在数据访问、管理上遵循最佳的实践,这样才能有效地管理和查询大规模的数据集合。
28 1
|
12天前
|
存储 NoSQL 安全
MongoDB:它如何悄然改变了全球开发者的数据游戏规则?
【8月更文挑战第8天】MongoDB是一款革命性的文档数据库,在开发者数据平台领域享有盛誉。以其独特的文档数据模型著称,无需预定义复杂模式即可高效存储与处理数据。支持实时数据分析及多云全球化部署,并具备企业级安全特性。从快速开发到大数据分析,MongoDB为现代应用提供全方位支持。
22 1
|
13天前
|
NoSQL MongoDB 数据库
DTS 的惊天挑战:迁移海量 MongoDB 数据时,捍卫数据准确完整的生死之战!
【8月更文挑战第7天】在数字化时代,大数据量的MongoDB迁移至关重要。DTS(数据传输服务)通过全面的数据评估、可靠的传输机制(如事务保证一致性)、异常处理(如回滚或重试),以及迁移后的数据校验来确保数据准确无损。DTS还处理数据转换与映射,即使面对不同数据库结构也能保持数据完整性,为企业提供可靠的数据迁移解决方案。
25 2
|
13天前
|
存储 NoSQL 物联网
MongoDB:改变游戏规则的数据库,看它如何统治数据世界的每一个角落
【8月更文挑战第7天】MongoDB是一款高性能、开源的NoSQL数据库,采用文档数据模型,支持丰富查询语言及二级索引。其灵活的数据模型和扩展性使其在大数据应用、实时分析、物联网、内容管理系统及电子商务平台等多种现代场景中广泛应用。例如,在大数据应用中,它可以高效存储社交媒体的非结构化数据;在实时分析中,能快速处理新数据并即时更新结果;在物联网应用中,则适用于存储大量非结构化传感器数据;而在内容管理和电子商务平台中,能提供灵活的内容存储和高效的商品搜索功能。
31 2
|
1月前
|
分布式计算 DataWorks NoSQL
DataWorks产品使用合集之怎么离线同步MongoDB的增量数据
DataWorks作为一站式的数据开发与治理平台,提供了从数据采集、清洗、开发、调度、服务化、质量监控到安全管理的全套解决方案,帮助企业构建高效、规范、安全的大数据处理体系。以下是对DataWorks产品使用合集的概述,涵盖数据处理的各个环节。
|
2月前
|
监控 NoSQL MongoDB
MongoDB中的TTL索引:自动过期数据的深入解析与使用方式
MongoDB中的TTL索引:自动过期数据的深入解析与使用方式
|
2月前
|
NoSQL 测试技术 MongoDB
使用同步和异步方式更新插入MongoDB数据的性能对比
在这篇文章中,我将探讨如何使用同步和异步方式插入数据到MongoDB,并对两种方式的性能进行对比。并将通过Python中的 pymongo 和 motor 库分别实现同步和异步的数据插入,并进行测试和分析。

热门文章

最新文章