前序:
mongobackup是开源的一个备份恢复小工具,为了测试其功能性,故进行如下测试
注:使用mongobackup是需要在replica set架构下使用,因为其备份的是oplog数据,单实例是不产生oplog的
格式:
mongobackup手册及mongobackup下载地址
http://dl.nosqldb.org/mongobackup
http://dl.nosqldb.org/mongobackup_user_guide_zh_CN.pdf
简介
mongobackup 是用于复制集的增量备份与恢复工具,恢复时,需要结合全量备份与恢复使用。
增量备份
普通备份
流模式备份
都可以指定备份初始时间点
增量恢复
必须指定起止时间点,配合全备,可以恢复到任意时间点(结束时间点),开始时间点可以理解为全备的时间点。
步骤:
备份过程
1、当前库数据信息:
trs1:PRIMARY> db.tt.find()
{ "_id" : ObjectId("5833ba3d4fde31eb3ab33310"),"b" : 1 }
2、使用mongodump进行全库备份:
$ /apps/mongo/bin/mongodump --host 10.25.161.15 --port 28018 -o /data/backups/
3、此时查看当前库的optime时间戳(后续就明白作用了)
trs1:PRIMARY> rs.status()
{
…….
"optime" : {
"ts" :Timestamp(1479786194, 1),
"t" :NumberLong(3)
}
…….}
4、向tt集合中插入一条数据
trs1:PRIMARY> db.tt.insert({b:2})
WriteResult({ "nInserted" : 1 })
5、此时查看当前库optime时间戳(方法参考第③步)
Timestamp(1479786470, 1)
6、模仿误操作,删除tt集合中一条记录
trs1:PRIMARY> db.tt.remove({b:1})
WriteResult({ "nRemoved" : 1 })
7、使用mongbackup做增量备份(即备份从第②步全库备份之后的oplog操作记录)
[mongo@localhost backups]$ mongobackup -h 10.25.161.15 --port 28018--backup -s 1479786194,1
connected to: 10.25.161.15:28018
Tue Nov 22 11:53:44.443 local.oplog.rs to backup/oplog.bson
Tue Nov 22 11:53:46.315 2 objects
恢复过程
此时我们需要恢复误删除的数据,也就是恢复到第⑤步的时间点
8、使用mongorestore工具恢复数据库到全库备份时的状态(即第②步)
[mongo@localhost backups]$ mongorestore --host 10.25.161.15:28018--drop
2016-11-22T12:09:17.570+0800 using default 'dump' directory
2016-11-22T12:09:17.570+0800 building a list of dbs and collections torestore from dump dir
2016-11-22T12:09:17.573+0800 reading metadata for test.tt fromdump/test/tt.metadata.json
2016-11-22T12:09:17.587+0800 restoring test.tt from dump/test/tt.bson
2016-11-22T12:09:17.605+0800 restoring indexes for collection test.ttfrom metadata
2016-11-22T12:09:17.606+0800 finished restoring test.tt (1 document)
2016-11-22T12:09:17.606+0800 done
注:使用--drop参数是删除原集合
9、此时tt集合中的数据:
trs1:PRIMARY> db.tt.find()
{ "_id" : ObjectId("5833c3d24fde31eb3ab33312"),"b" : 1 }
10、使用mongobackup恢复全库备份之后,删除之前添加的数据(即恢复到第⑥步之前)
[mongo@localhost backups]$ mongobackup -h 10.25.161.15 --port 28018--recovery -s 1479786194,1 -t 1479786470,1
connectedto: 10.25.161.15:28018
TueNov 22 12:12:58.158 Replaying file oplog.bson
TueNov 22 12:12:58.158 Only applying oplog entries matching this criteria: {"ts" : { "$gte" : { "$timestamp" : {"t" : 1479786194, "i" : 1 } }, "$lte" : {"$timestamp" : { "t" : 1479786470, "i" : 1 } } }}
2objects found
TueNov 22 12:12:58.159 Successfully Recovered.
11、此时查看tt集合数据:
trs1:PRIMARY> db.tt.find()
{"_id" : ObjectId("5833c3d24fde31eb3ab33312"), "b": 1 }
{"_id" : ObjectId("5833c44d4fde31eb3ab33313"), "b": 2 }
发现已经恢复回来
结论:
实测结果证明mongobackup工具是可以实现数据恢复已经增量备份功能的,不过此实验中是预先知道了timestamp时间戳,如何在实战中根据时间来恢复,这个还需要我后续进行研究测试。
如果想进行了一次全库备份(mongodump)之后,想实施增量备份,则可以使用mongobackup的流模式备份
mongobackup -h 10.25.161.15 --port 28018 --backup --stream