使用MONGODB 集群的OPLOG 日志进行数据恢复
生活随笔
收集整理的這篇文章主要介紹了
使用MONGODB 集群的OPLOG 日志进行数据恢复
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
(以下方法只能恢復(fù)部分?jǐn)?shù)據(jù),因?yàn)镺PLOG 表并沒有保存所有的同步日志,是有大小限制的)
因?yàn)閛plog 表(collection 后面為了習(xí)慣,就叫表了)沒有索引,而我卻要選擇我需要恢復(fù)的某個(gè)表的數(shù)據(jù)。
所以先把各個(gè)分片中的oplog表分別導(dǎo)出到另外一臺(tái)服務(wù)器進(jìn)行處理:
1.備份出來:
./mongodump --port 28011 -d local -c oplog.rs? -o? /opt/backup/0706local/
2.恢復(fù)到另外一臺(tái)單節(jié)點(diǎn)MONGODB服務(wù)器
mongorestore --port 28011 -d temp_local -c shard1_oplog? --dir /opt/backup/0706local/local/oplog.rs.bson
......
mongorestore --port 28012 -d temp_local -c shard4_oplog? --dir /opt/backup/0706local/local/oplog.rs.bson
有多少個(gè)分片,就有多少個(gè)新建立的表。
3.建立索引,以方便查詢數(shù)據(jù):
> db.shard4_oplog.createIndex({ns:1,op:1})
{
?? ?"createdCollectionAutomatically" : false,
?? ?"numIndexesBefore" : 0,
?? ?"numIndexesAfter" : 1,
?? ?"ok" : 1
}
4.本來想先把沒用的數(shù)據(jù)刪除的,但因?yàn)閛plog原來是個(gè)capped 表,無法刪除數(shù)據(jù),只好做罷,就這樣處理吧。
> db.shard4_oplog.remove({ns:"ds.tb_monitor",op:{$ne:'i'}})
WriteResult({
?? ?"nRemoved" : 0,
?? ?"writeError" : {
?? ??? ?"code" : 20,
?? ??? ?"errmsg" : "cannot remove from a capped collection: oplog.shard4_oplog"
?? ?}
})
5.編寫代碼,對(duì)每行數(shù)據(jù)查詢到后,添加到一個(gè)新的表:
關(guān)于:forEach:
Step 2: Create backup of 2.6 admin.system.users collection. Copy all documents in the
admin.system.users(page 286) collection to theadmin.system.new_userscollection:
db.getSiblingDB("admin").system.users.find().forEach( function(userDoc) {
status = db.getSiblingDB("admin").system.new_users.save( userDoc );
if (status.hasWriteError()) {
print(status.writeError);
}
}
);
使用類似方法,寫了一個(gè)把日志數(shù)據(jù)保存到另外一個(gè)表的功能:
(把表名為要恢復(fù)的表名,操作類型為'i'---新數(shù)據(jù)插入 的數(shù)據(jù)取出,保存到另外一個(gè)新表)
db.shard3_oplog.find({ns:"ds.tb_monitor",op:'i'}).forEach(function(res_data){
obj_doc = res_data["o"]; #取出oplog中插入的JSON對(duì)象
status = db.tb_monitor.save( obj_doc ); #保存到新表中。
if (status.hasWriteError()) {
print(status.writeError);
}
}
)
6.再把這個(gè)新建立的表,導(dǎo)出,再恢復(fù)到集群中為一個(gè)新表,再使用5方法,保存到源表中。
./mongodump? -d local -c shard1_oplog? -o? /opt/backup/0706local/
mongorestore --port 28000 -d temp_local -c new_collection? --dir /opt/backup/0706local/local/shard1_oplog.bson
db.new_collection.find().forEach(function(res_data){
status = db.tb_monitor.save( res_data );
if (status.hasWriteError()) {
print(status.writeError);
}
}
)
總結(jié)
以上是生活随笔為你收集整理的使用MONGODB 集群的OPLOG 日志进行数据恢复的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongoDB3.0.2 升级操作
- 下一篇: MONGODB 集群架构 调整,增加延迟