使用MONGODB 集群的OPLOG 日志进行数据恢复
2015-07-07 11:57
1116 查看
(以下方法只能恢复部分数据,因为OPLOG 表并没有保存所有的同步日志,是有大小限制的)
因为oplog 表(collection 后面为了习惯,就叫表了)没有索引,而我却要选择我需要恢复的某个表的数据。
所以先把各个分片中的oplog表分别导出到另外一台服务器进行处理:
1.备份出来:
./mongodump --port 28011 -d local -c oplog.rs -o /opt/backup/0706local/
2.恢复到另外一台单节点MONGODB服务器
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.建立索引,以方便查询数据:
> db.shard4_oplog.createIndex({ns:1,op:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 0,
"numIndexesAfter" : 1,
"ok" : 1
}
4.本来想先把没用的数据删除的,但因为oplog原来是个capped 表,无法删除数据,只好做罢,就这样处理吧。
> 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.编写代码,对每行数据查询到后,添加到一个新的表:
关于: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);
}
}
);
使用类似方法,写了一个把日志数据保存到另外一个表的功能:
(把表名为要恢复的表名,操作类型为'i'---新数据插入 的数据取出,保存到另外一个新表)
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.再把这个新建立的表,导出,再恢复到集群中为一个新表,再使用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);
}
}
)
因为oplog 表(collection 后面为了习惯,就叫表了)没有索引,而我却要选择我需要恢复的某个表的数据。
所以先把各个分片中的oplog表分别导出到另外一台服务器进行处理:
1.备份出来:
./mongodump --port 28011 -d local -c oplog.rs -o /opt/backup/0706local/
2.恢复到另外一台单节点MONGODB服务器
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.建立索引,以方便查询数据:
> db.shard4_oplog.createIndex({ns:1,op:1})
{
"createdCollectionAutomatically" : false,
"numIndexesBefore" : 0,
"numIndexesAfter" : 1,
"ok" : 1
}
4.本来想先把没用的数据删除的,但因为oplog原来是个capped 表,无法删除数据,只好做罢,就这样处理吧。
> 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.编写代码,对每行数据查询到后,添加到一个新的表:
关于: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);
}
}
);
使用类似方法,写了一个把日志数据保存到另外一个表的功能:
(把表名为要恢复的表名,操作类型为'i'---新数据插入 的数据取出,保存到另外一个新表)
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.再把这个新建立的表,导出,再恢复到集群中为一个新表,再使用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);
}
}
)
相关文章推荐
- mongodb group包(最具体的、最受欢迎、最容易理解的解释)
- MongoVUE下实现MongoDB的Group分组查询
- MongoDB服务的启动
- mongoDB聚合
- MongoDB运行状态监控、性能分析工具mongostat详解
- MongoDB主从配置
- 安装配置MongoDB
- 学习MongoDB 二:MongoDB添加、删除、修改
- MongoDB运行状态监控、性能分析工具mongostat详解
- mongodb 学习笔记05 --用户管理
- MongoDB数据库可视化软件MongoVUE的安装使用
- mongodb安装
- 基于mongodb, 设计游戏中的个人背包系统
- 12-【MongoDB入门教程】MongoDB写关注
- MongoDB: The Definitive Guide
- PHP 操作Mongodb 实例
- MongoDB运行状态、性能监控,分析
- Mongodb for Mac 安装
- 十个 MongoDB 使用要点
- [ mongoDB ] - MongoDB 连接池