mongodb备份oplog_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":1588138496,"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条件,更新时才有

# 起始时间戳可自由指定,不必oplog中找记录。稍微早于需要的时间点即可。

./mongodump -h 192.168.6.116:27017 -u admin -p admin --authenticationdatabase admin -d local -c oplog.rs -q '{"ts":{"$gt": {"$timestamp":{"t":1588138300,"i":1}}}}' -o /data/tmp/rs1

## 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":1588138393,"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恢复到某台单机上,再使用导出导入的方法将数据移到生产环境。

原文:https://www.cnblogs.com/frx9527/p/oplog.html

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值