持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
方案一:通过 oplog 恢复
部署的是 MongoDB 复制集,这时还有一线希望,可以通过 oplog 来尽可能的恢复数据;MongoDB 复制集的每一条修改操作都会记录一条 oplog,所以当数据库被误删后,可以通过重放现有的oplog来「尽可能的恢复数据」。因为oplog是固定大小的集合,所以使用oplog恢复数据速度尽可能快,不然数据会被覆盖。
1、导出 oplog 集合
mongodump -d local -c oplog.rs -o backupdir -u root -p 123456 --authenticationDatabase admin --port 20001
复制代码
2、备份集合数据
mkdir new_backupdir;
cp backupdir/local/oplog.rs.bson new_backupdir/oplog.bson;
复制代码
3、重放oplog
mongorestore new_backupdir -u root -p 123456 --authenticationDatabase admin --port 20001;
# 如果遇到认证问题
db.createRole({role:'sysadmin',roles:[], privileges:[ {resource:{anyResource:true},actions:['anyAction']}]})
db.grantRolesToUser( "admin" , [ { role: "sysadmin", db: "admin" } ])
复制代码
方案二:从复制集其他节点恢复数据或者节点迁移
MongoDB 通过复制集能保证高可靠的数据存储,通常生产环境建议使用「3节点复制集」,这样即使其中一个节点崩溃了无法启动,我们可以直接将其数据清掉,重新启动后,以全新的 Secondary 节点加入复制集,或者是将其他节点的数据复制过来,重新启动节点,它会自动的同步数据,这样也就达到了恢复数据的目的。
1、关闭需要数据同步的节点
docker stop node; # docker环境中
db.shutdownServer({timeoutSecs: 60}); # 非docker环境
复制代码
2、拷贝目标节点机器的数据存储目录(/dbPath)到当前机器的指定目录。
scp 目标节点 shard/data -> 当前节点 shard/data
复制代码
3、重新指定数据文件启动mongodb节点
docker run -d -p 20002:20001 -v $PWD/shard/data:/data/mongodb -v $PWD/shard2/log:/data/log --name shard2 mongod:3.4 \
--shardsvr --replSet rs2 --dbpath /data/mongodb --logpath /data/log/shard2.log --keyFile /data/key/keyfile --port 20001 --slowms 200 --logappend --wiredTigerCacheSizeGB 2;
复制代码
4、将新的节点添加到复制集
# 进入到主节点
rs.add("<hostnameNew>:<portNew>"); # 添加新的节点
rs.status() # 等待所有成员恢复正常,检测成员状态
rs.remove("<hostnameOld>:<portOld>") # 移除原来的节点