还原库
我们看到集合orderdetial在两个数据库不一致,有差异。即这种备份还原 无法保证数据一致性。
3.1.2 增加 参数--oplog 参数下备份还原
Step 1 删除 上次测试中遗留的集合 和 备份文件
Step 2 启动insert命令
for(var i = 0; i < 10000; i++)
{ db.order0531.insert({a: i});};
for(i=0;i<150000;i++)
{ db.orderdetial.insert({"id":i,"name":"shenzheng","addr":"龙岗","date":new Date()}); };
Step 3 执行备份命令
./mongodump -h 172.177.XXX.XXX --port 端口 --oplog --authenticationDatabase admin -u 用户名 –p密码 --gzip -o /data/mongodb_back/mongotestdump
从打印结果来看,有对oplog命令的输出,查看备份文件 多了一个 oplog.bson 文件
Step 4 执行还原命令,增加参数 --oplogReplay
./mongorestore -h 172.177.XXX.XXX --port 端口 --oplogReplay --authenticationDatabase admin -u 用户名 –p 密码 --gzip /data/mongodb_back/mongotestdump
从执行情况来看,此类还原命令有还原oplog
Step 5 比对数据
源库
还原库
本场景测试结论:
虽然结果数据仍不一致,但从后者的备份还原过程可以看出,有对oplog做单独的处理。
数据可以保证以oplog结尾为准,实现了多集合(表)的时间一致性(MongoDB本身特性,不保证体现数据库的事务一致性)。
3.2 场景二 还原到指定时间点
使用场景3.1.2 的备份文件,测试还原到备份过程中的某个时刻。从上次备份过程可知,开始时间为2018-05-31T11:13:46.501+0800,结束时间为 2018-05-31T11:14:12.961+0800
此轮测试还原点选择在此时间段内。时间还原点的选择,假如我们还原到orderdetial 集合"_id" : ObjectId("5b0f6876c52291864d3485b9")的插入时的时间点。
查看此时间点对应的时间和操作序列,在源库local中的oplog.rs 集合查询。
(oplog.rs集合的数据意义,我们在其他章节介绍,在此不做赘述)
"ts" : Timestamp(1527736438, 858)
此文档对应的 "id" : 9719.0,插入时间为2018-05-31T11:13:58.721+0800 【正好,在mongodump的过程中】
Step 1 删除还原服务器中的还原库(上面测试遗留的数据库)
Step 2 执行还原命令,通过--oplogLimit 参数指定时间点,时间点为上一步查到的Timestamp(1527736438, 858)
./mongorestore -h 172.177.XXX.XXX --port 端口 --oplogReplay --oplogLimit "1527736438:858" --authenticationDatabase admin -u 用户名 -p 密码 /data/mongodb_back/mongotestdump