返回顶部
首页 > 资讯 > 数据库 >Mongodb 之 oplog
  • 877
分享到

Mongodb 之 oplog

Mongodboplog 2015-03-13 15:03:13 877人浏览 绘本
摘要

一开始我就以为 oplog 应该就类似于 Mysql bin-log 而事实上,确实差不多。oplog 也是用于复制集间由 Primary 记录,Secondary 用来同步。从而保持数据一致。 最近遇到了误删db(删库不能跑路)

Mongodb 之 oplog

一开始我就以为 oplog 应该就类似于 Mysql bin-log 而事实上,确实差不多。oplog 也是用于复制集间由 Primary 记录,Secondary 用来同步。从而保持数据一致。

最近遇到了误删db(删库不能跑路)的事情,所以,实验了N多次的 oplog 恢复数据。

特地记录一下,以备后查。

# ------------------------------ oplog ---------------------------------
## 1. 在复制集中使用 oplog ,可以使用以下命令查看oplog情况:
rpset1:PRIMARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 149092secs (41.41hrs)
oplog first event time: Sun Apr 26 2020 20:25:46 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:50:38 GMT+0800 (CST)
now: Tue Apr 28 2020 13:50:38 GMT+0800 (CST)

rpset1:SECONDARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 149937secs (41.65hrs)
oplog first event time: Sun Apr 26 2020 20:10:59 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:49:56 GMT+0800 (CST)
now: Tue Apr 28 2020 13:49:56 GMT+0800 (CST)

rpset1:SECONDARY> rs.printReplicationInfo()
configured oplog size: 10240MB
log length start to end: 148635secs (41.29hrs)
oplog first event time: Sun Apr 26 2020 20:32:00 GMT+0800 (CST)
oplog last event time: Tue Apr 28 2020 13:49:15 GMT+0800 (CST)
now: Tue Apr 28 2020 13:49:16 GMT+0800 (CST)

# 配置文件 conf/slave.conf 中的oplogSize
replication:
  oplogSizeMB: 10240
  replSetName: rpset1

 从以上的命令中可以看出,这个复制集的 oplog 有41小时的容量,而这个 mongoDB 每天都有定时备份。所以,这个容量肯定是够用了。

使用 oplogReplay 恢复数据,官文说必须要有一个特殊的权限。

## 2. 创建专门的角色使用 oplogReplay  此角色必须有 anyResource 和 anyAction
# 备份时不需要此权限,但恢复时必须要有此权限,否则恢复失败且没有报错信息。
use admin
db.createRole(
   {
    "role" : "sysadmin",
    "privileges" : [{ "resource" : {"anyResource" : true}, "actions" : ["anyAction"] }],
    "roles" : []
   }
)

# 创建专门的用户使用此角色
db.createUser({user:"admin", pwd:"admin", roles:[{role:"sysadmin", db:"admin"}]})
# 或者授权某个用户 db.grantRolesToUser( "root" , [ { role: "sysadmin", db: "admin" } ])  

 

检查一下定时备份db的命令,找到如下:

## 3. 日常全量备份
./monGodump -h 10.170.6.116:27017 -u admin -p admin --authenticationDatabase admin --gzip -o /data/tmp/rs0

# 备份时如果有 --oplog 选项,输出目录下就会有 oplog.bson 文件
# ./mongodump -h 10.170.6.116:27000 -u rsroot -p abcd1234 --authenticationDatabase admin --oplog -o /data/tmp/rs0

 

因为备份时没有带 --oplog 参数,所以进行恢复时,使用先恢复备份,再 oplogReplay的方式完成,也就是参考下面的第9点。

而4到8点,用来在恢复备份的同时带上 oplogReplay 的方式。

## 4. 假设上次日常备份之后的某个时间点出现了误删除操作,就需要利用 oplogReplay 来恢复这段时间的新数据
# 先检查上次日常备份的时间点(如果 dump 时使用了 --oplog 参数,就会有oplog.bson文件。如果没有,可参考第9条):
./bsondump /data/tmp/rs0/oplog.bson > /data/tmp/0
cat /data/tmp/0  
# 找到第一行 {"ts":{"$timestamp":{"t":1588232496,"i":1}}, ...

# 字段的意思:
ts: 操作发生的时间,t: unix时间戳, i: 可以认为是同一时间内的第几个.
h: 记录的唯一ID
v: 版本信息
op: 写操作的类型
   n: no-op
   c: db cmd
   i: insert
   u: update
   d: delete

ns: 操作的namespace, 即: 数据库.集合
o: 操作所对应的文档
o2: 更新时所对应的where条件,更新时才有


## 5. 导出当前的 local/oplog.rs  注意 -q 选项的 JSON格式
# 因为备份整个 local/oplog.rs 容量太大,恢复也会耗时过长,所以采用起始时间的方式:
./mongodump -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin -d local -c oplog.rs -q "{"ts":{"$gt": {"$timestamp":{"t":1588232496,"i":1}}}}" -o /data/tmp/rs1
# 也可以同时指定结束时间,如下:
./mongodump -h 192.168.6.116:27017 -u rsroot -p abcd1234 --authenticationDatabase admin -d local -c oplog.rs -q "{"ts":{"$lte": {"$timestamp":{"t":1588142111,"i":1}}, "$gte": {"$timestamp":{"t":1588138393,"i":1}}}}" -o /data/tmp/rs2


## 6. 检查 oplog.rs.bson 手工找出误删除的时间戳:
./bsondump /data/tmp/rs1/local/oplog.rs.bson > /data/tmp/1
# 打开 /data/tmp/1 手工查找,如果有删除表或库,则有 drop 信息, 如果有删除数据,则有 "op":"d" 信息


## 7. 替换日常全备份中的 oplog.bson
rm -rf /data/tmp/rs0/oplog.bson
mv /data/tmp/rs1/local/oplog.rs.bson /data/tmp/rs0/oplog.bson


## 8. 执行恢复命令(注意用户权限)
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin --oplogReplay --oplogLimit "1588232764:1" --dir /data/tmp/rs0/ 
# 其中 1588232764 即是 $timestamp 中的"t",1 即是 $timestamp 中的 "i" 这样配置后oplog将会
# 重放到这个时间点以前,即正好避开了第一条删除语句及其后面的操作,数据库停留在灾难前状态


## 9. 如果日常备份没有 --oplog 并且使用了 --gzip,可以先恢复此备份。
# 然后再使用oplogReplay 指定单独的 oplog.rs.bson 文件进行恢复.
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin /data/tmp/rs0/ --gzip
./mongorestore -h 192.168.6.116:27017 -u admin -p admin --authenticationDatabase admin --oplogReplay --oplogLimit "1588232764:1" /data/tmp/rs1/local/oplog.rs.bson

不必担心数据混乱。因为 oplog 的幂等性,即使多次Replay 也不会产生重复数据。  已存在相同的 _id,即使其它字段不同,也不会恢复,不存在的 _id 则会恢复。

当然,也可以将备份和oplog恢复到某台单机上,再使用导出导入的方法将数据移到生产环境。

 

您可能感兴趣的文档:

--结束END--

本文标题: Mongodb 之 oplog

本文链接: https://lsjlt.com/news/5911.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Mongodb 之 oplog
    一开始我就以为 oplog 应该就类似于 mysql bin-log 而事实上,确实差不多。oplog 也是用于复制集间由 Primary 记录,Secondary 用来同步。从而保持数据一致。 最近遇到了误删db(删库不能跑路)...
    99+
    2015-03-13
    Mongodb oplog
  • mongodb 学习之oplog
    背景:   原来一个同事问我主从mongodb数据库为什么数据差距很大,我让他察看一下两边有啥不一样,发现主的local库有13G从却很小,进入local之后du发现有一个collect...
    99+
    2024-04-02
  • MongoDB更改oplog大小
    【问题说明】        在生产环境新增secondary:10.9.197.6:27017...
    99+
    2024-04-02
  • MongoDB 更改 Oplog Size 大小
    MongoDB 的副本集同步中 Oplog 占了非常关键的作用。Oplog Size 可不可以随意更改?https://docs.mongodb.com/manual/reference/configura...
    99+
    2024-04-02
  • MongoDB中怎么开启Oplog
    这篇文章给大家介绍MongoDB中怎么开启Oplog,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。配置过程其实配置的过程比较简单。step 1 : 在配置文件中 添加副本集参数(rep...
    99+
    2024-04-02
  • MongoDB Oplog中的字段介绍
    {     "ts" : Timestamp(1446011584, 2),         "h" : NumberLong("16873591...
    99+
    2024-04-02
  • mongoDB复制集修改 oplog 大小
    ctiy:PRIMARY> use local switched to db local ctiy:PRIMARY> db.oplog.rs.stats().maxSize //查看大小 NumberLong("53687091200...
    99+
    2019-07-06
    mongoDB复制集修改 oplog 大小 数据库入门 数据库基础教程 数据库 mysql
  • Mongodb中oplog的原理是什么
    Mongodb中oplog的原理是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。Oplog 是 MongoDB 实现复制集的关键数据结...
    99+
    2024-04-02
  • MongoDB中 oplog的作用是什么
    本篇文章为大家展示了MongoDB中 oplog的作用是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 1:oplog简介 oplog是local库下的一个...
    99+
    2024-04-02
  • mongodb中oplog介绍和格式详析
    目录1. 基本概念 2. Oplog 的默认储存大小 3. 可能需要更大oplog的工作负载 4. Oplog状态 5. Oplog格式 6. CUD操作和Oplog的对应关系 de...
    99+
    2024-04-02
  • MongoDB利用oplog恢复数据的方法
    目录数据全备模拟故障写入数据模拟误操作恢复步骤备份oplog解析oplog将oplog备份和全备复制到standalone机查找误操作时间点进行数据恢复检查恢复结果当我们对数据出现误...
    99+
    2024-04-02
  • MongoDB中怎么利用oplog恢复数据
    今天小编给大家分享一下MongoDB中怎么利用oplog恢复数据的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。当我们对数据出...
    99+
    2023-06-29
  • mongodb 中怎么利用oplog恢复时间点
    mongodb 中怎么利用oplog恢复时间点,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。1.首先创建hezi集合,并插入1...
    99+
    2024-04-02
  • mongodb中oplog的格式和作用是什么
    这篇文章主要讲解了“mongodb中oplog的格式和作用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“mongodb中oplog的格式和作用是什么”吧!目录 基本概念 Oplog 的...
    99+
    2023-06-20
  • MongoDB修改oplog大小的方法有哪些
    这篇文章主要介绍“MongoDB修改oplog大小的方法有哪些”,在日常操作中,相信很多人在MongoDB修改oplog大小的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”MongoDB修改oplo...
    99+
    2023-06-29
  • 分享MongoDB修改oplog大小的4种方法
    目录方法一方法二方法三1.关闭mongod2.修改配置文件3.启动mongod实例,并备份oplog4.重建oplog5.插入前面保存的oplog时间点记录6.关闭mongod实例方...
    99+
    2024-04-02
  • 剖析后OpLog订阅MongoDB的数据变更就没那么难了
    目录前言oplog简介解析oplog代码结语前言 我们开源了一个订阅分发mysql的binlog的项目,一直用的非常好,忽然有天开发说能不能支持MongoDB的数据订阅呢,Mongo...
    99+
    2024-04-02
  • NoSQL之mongodb
    NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。指的是非关系型的数据库,是对不同于传统的关系型数据库的数据库管理系统的统称。NoSQL用于超大规模数据的存储。这些类型的数据...
    99+
    2024-04-02
  • MongoDB之GridFS
    在MongoDB里面支持大数据的存储(例如图片、音乐、各种二进制数据),但是这个做法需要用户自己进行处理,使用“mongofiles”命令完成。 1、利用命令行进入到图片所做的路径 [root@D2-LZ...
    99+
    2024-04-02
  • 一次oplog损坏事故
    问题    1)程序报警Execution Timeout Couldn't get a connection wi...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作