使用MONGODB 集群的OPLOG 日志进行数据恢复
生活随笔
收集整理的這篇文章主要介紹了
使用MONGODB 集群的OPLOG 日志进行数据恢复
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
(以下方法只能恢復(fù)部分?jǐn)?shù)據(jù),因為OPLOG 表并沒有保存所有的同步日志,是有大小限制的)
因為oplog 表(collection 后面為了習(xí)慣,就叫表了)沒有索引,而我卻要選擇我需要恢復(fù)的某個表的數(shù)據(jù)。
所以先把各個分片中的oplog表分別導(dǎo)出到另外一臺服務(wù)器進行處理:
1.備份出來:
./mongodump --port 28011 -d local -c oplog.rs? -o? /opt/backup/0706local/
2.恢復(fù)到另外一臺單節(jié)點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
有多少個分片,就有多少個新建立的表。
3.建立索引,以方便查詢數(shù)據(jù):
> db.shard4_oplog.createIndex({ns:1,op:1})
{
?? ?"createdCollectionAutomatically" : false,
?? ?"numIndexesBefore" : 0,
?? ?"numIndexesAfter" : 1,
?? ?"ok" : 1
}
4.本來想先把沒用的數(shù)據(jù)刪除的,但因為oplog原來是個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.編寫代碼,對每行數(shù)據(jù)查詢到后,添加到一個新的表:
關(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);
}
}
);
使用類似方法,寫了一個把日志數(shù)據(jù)保存到另外一個表的功能:
(把表名為要恢復(fù)的表名,操作類型為'i'---新數(shù)據(jù)插入 的數(shù)據(jù)取出,保存到另外一個新表)
db.shard3_oplog.find({ns:"ds.tb_monitor",op:'i'}).forEach(function(res_data){
obj_doc = res_data["o"]; #取出oplog中插入的JSON對象
status = db.tb_monitor.save( obj_doc ); #保存到新表中。
if (status.hasWriteError()) {
print(status.writeError);
}
}
)
6.再把這個新建立的表,導(dǎo)出,再恢復(fù)到集群中為一個新表,再使用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 日志进行数据恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mongoDB3.0.2 升级操作
- 下一篇: MONGODB 集群架构 调整,增加延迟