-
Type: Bug
-
Resolution: Done
-
Priority: Major - P3
-
Affects Version/s: 3.0.3, 3.1.5
-
Component/s: mongorestore
-
None
-
Environment:Debian 7 amd64
-
Server Tools C (11/23/15)
When using mongorestore with option --oplogReplay to replay oplogs, I found a strange error that mongorestore cannot handle binData field's set operation. You maybe meet the same error if you do this:
1. insert a test data.
db.testData.insert({_id: 10000, data: BinData(0, "CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA="), size: 10})
2. update its binData field.
db.testData.update({_id: 10000}, {$set: {data: BinData(0, "")}})
3. update its other field
db.testData.update({_id: 10000}, {$set: {size: 20}})
4. check with oplog
use local db.oplog.rs.find().sort({$natural: -1})
you may see the following response:
{ "ts" : Timestamp(1435505075, 1), "h" : NumberLong("311789885375292809"), "v" : 2, "op" : "u", "ns" : "test.testData", "o2" : { "_id" : 10000 }, "o" : { "$set" : { "size" : 20 } } } { "ts" : Timestamp(1435504921, 1), "h" : NumberLong("8559347228340080808"), "v" : 2, "op" : "i", "ns" : "test.testData", "o" : { "_id" : 10000, "data" : BinData(0,"CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjI yMi4xMhDEJxgKIAA="), "size" : 10 } }
5. dump these two oplog and replay it
In bash shell:
mongodump --port 27017 -d local -c oplog.rs --query '{"ts" : {$gte: Timestamp(1435504921, 1)}}' -o ./oplogD/
mv ./oplogD/local/oplog.rs.bson ./oplogR/oplog.bson
mongorestore --port 27017 --oplogReplay ./oplogR/
*after this* you would find data not as expected. In my own, data changes to this.
{ "_id" : 10000, "data" : BinData(0,"c2V0ABMAAAABc2l6ZQAAAAAAAAA0QAAAADIyMi4xMhDEJxgKIAA="), "size" : 20 }
The size field is really correct, but the data field is not correct.
6. The most *strange* thing would be this, if you dump only *one* oplog and replay it, the data would be correct.
mongodump --port 27017 -d local -c oplog.rs --query '{"ts" : Timestamp(1435504921, 1)}' -o ./tmpD/
mv ./tmpD/local/oplog.rs.bson ./tmpR/oplog.bson
mongorestore --port 27017 --oplogReplay ./tmpR/
After oplog replayed, the 'data' field is quite correct.
{ "_id" : 10000, "data" : BinData(0,"CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA="), "size" : 10 }
Link in stackoverflow: http://stackoverflow.com/questions/31101768/error-when-using-mongorestore-to-replay-oplog-with-bindata-field