四、mongodb数据备份和恢复(测试未完成)

一、环境信息:
IP地址配置规格主机名系统版本
192.168.86.39:270172核2Gmongodb01centos7.7
192.168.86.39:270182核2Gmongodb02centos7.7
192.168.86.39:270192核4Gmongodb03centos7.7
192.168.86.39:27020(延时节点)2核2Gmongodb04centos7.7
192.168.86.39:27021(集群恢复节点)2核4Gmongodb05centos7.7

集群模式:副本集
延时时间: 300秒(测试使用)

二、数据和环境准备

1、测试数据准备

mongo 192.168.86.39:27017(PRIMARY)
use duanshuaixing-mongodb-test
for(i=1; i<=10;i++){
  db.user.insert( {name:'mongodb-test'+i, age:i} )
} 

db.user.count()
db.user.find()

2、故障场景1:集群全部节点故障
思路:通过获取已有节点的数据目录启动一个新的集群,尽量使用主节点数据目录,避免从节点因延迟导致数据丢失

2.1 登录使用原数据库数据目录启动mongodb,认证信息和原集群一致

mongo 192.168.86.39:27021
rs0:OTHER> rs.slaveOk()
rs0:OTHER> use admin
rs0:OTHER> db.auth('root','rootPassw0rd')

2.2 在新启动数据库内修改主节点信息并删除其余从节点(节点网络互通的情况下会导致原有集群内节点被移除,请慎重操作)
1>获取副本集配置

rs0:OTHER> cfg=rs.conf()
rs0:OTHER> printjson(cfg)

2>查看配置节点

rs0:OTHER> printjson(cfg.members[0])

3>重新配置节点

rs0:OTHER> cfg.members[0].host="192.168.86.39:27021"
rs0:OTHER> rs.reconfig(cfg, {force : true})

4>查看数据库是否存在且数据正常

rs0:SECONDARY> show dbs
rs0:SECONDARY> use duanshuaixing-mongodb-test
rs0:SECONDARY> db.user.find().count(

5>强制删除其他节点还原为单节点副本集群

rs0:SECONDARY> use admin
rs0:SECONDARY> cfg = rs.conf()
rs0:SECONDARY> printjson(cfg)

#删除member为1、2、3的节点
rs0:SECONDARY> cfg.members.splice(1,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:SECONDARY> cfg.members.splice(2,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:SECONDARY> cfg.members.splice(3,1)
rs0:SECONDARY> rs.reconfig(cfg, {force : true})
rs0:PRIMARY> rs.status()

2.3 3节点集群到现在已经恢复成单节点副本集模式
节点为PRIMARY,可以正常读写mongo内数据,也可以通过mongodump等工具获取此节点误删除数据,亦可以添加其他节点组成新的集群

3、故障场景2:误删除databases, 延迟备份内数据完整,通过延迟备份恢复

0>模拟误操作删除数据库
rs0:PRIMARY> use duanshuaixing-mongodb-test
db.dropDatabase()

1>业务停止写入避免数据不一致,同时修改及时修改延时节点延时时间,避免被同步覆盖
cfg = rs.conf();
cfg.members[3].priority = 0;
cfg.members[3].hidden = true;
cfg.members[3].slaveDelay = 6000;
cfg.members[3].votes = 1;
rs.reconfig(cfg)


2>在延时节点通过mongodump导出备份数据
mongodump -h 192.168.86.39:27020 -u=root -p=rootPassw0rd  -dduanshuaixing-mongodb-test --authenticationDatabase admin  -o /tmp/duanshuaixing-mongodb-test-dump

3>通过备份数据恢复mongo数据库
mongorestore -h 192.168.86.39:27017 -u=root -p=rootPassw0rd --authenticationDatabase admin /tmp/duanshuaixing-mongodb-test-dump/

4、故障场景3:误删除collection的数据记录且延时备份没有储存备份信息
参考:https://www.cnblogs.com/easydb/p/14286810.html
1>数据不存在于延时节点内
#模拟删除操作

use duanshuaixing-mongodb-test
db.user.remove({ name: {$regex: "mongodb-test[4-6]"} })

#由于数据没有同步到延时节点在没有其他备份的情况下只能通过oplog恢复

0> 查看oplog窗口覆盖时间
rs.printReplicationInfo()

1>导出全量oplog
mkdir -p /tmp/oplog/
mongodump -h 192.168.86.39:27017 -u=root -p=rootPassw0rd  --authenticationDatabase admin  --oplog  -o /tmp/oplog/

2>从全量oplog查看全备最后一个时间的数据

bsondump /tmp/oplog/oplog.bson >>/tmp/oplog/oplog.json
cat /tmp/oplog/oplog.json

{"t":1632307990,"i":1}}是上一次全备最后的时间戳

3>根据时间戳导出最后一次全备以后的增量数据
mkdir -p /tmp/oplog2
mongodump -h 192.168.86.39:27017 -u=root -p=rootPassw0rd  --authenticationDatabase admin -d local -c oplog.rs -q '{"ts":{"$gt":"Timestamp(1632307990)"}}' -o /tmp/oplog2

4>恢复最后一次oplog全备
mongorestore -h 192.168.86.39:27017 -u=root -p=rootPassw0rd  --authenticationDatabase admin  --oplogReplay  /tmp/oplog/

5>恢复增量数据

FAQ

1、缓解mongodump占用节点内存无法释放问题
mongodump --host localhost --port 27017 --db test --out /home/mongodump --numParallelCollections 1

--numParallelCollections 1 #指定并发数量为1,默认是4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值