0

当使用带有选项--oplogReplay 的mongorestore 来重放oplogs 时,我发现了一个奇怪的错误,即mongorestore 无法处理binData 字段的设置操作。如果你这样做,你可能会遇到同样的错误:

  1. 插入测试数据。

    db.testData.insert({_id: 10000, data: BinData(0, ""), size: 10})
    
  2. 更新其 binData 字段。

    db.testData.update({_id: 10000}, {$set: {data: BinData(0, "CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA=")}})
    
  3. 更新其其他字段

    db.testData.update({_id: 10000}, {$set: {size: 20}})
    
  4. 用 oplog 检查

    use local
    
    db.oplog.rs.find().sort({$natural: -1})
    

    您可能会看到以下响应:

    { "ts" : Timestamp(1435627154, 1), "h" : NumberLong("-4979206321598144076"), "v" : 2, "op" : "u", "ns" : "test.testData", "o2" : { "_id" : 10000 }, "o" : { "$set" : { "size" : 20 } } }
    { "ts" : Timestamp(1435627144, 1), "h" : NumberLong("2899524097634687825"), "v" : 2, "op" : "u", "ns" : "test.testData", "o2" : { "_id" : 10000 }, "o" : { "$set" : { "data" : BinData(0,"CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA=") } } }
    { "ts" : Timestamp(1435627136, 1), "h" : NumberLong("-8486373688715225152"), "v" : 2, "op" : "i", "ns" : "test.testData", "o" : { "_id" : 10000, "data" : BinData(0,""), "size" : 10 } }
    
  5. 转储这两个 oplog 并重放它

    在 bash 外壳中:

    mongodump --port 27017 -d local -c oplog.rs --query '{"ts" : {$gte: Timestamp(1435627144, 1)}}' -o ./oplogD/
    
    mv ./oplogD/local/oplog.rs.bson ./oplogR/oplog.bson
    
    mongorestore --port 27017 --oplogReplay ./oplogR/
    

    在此之后,您会发现数据不符合预期。就我自己而言,数据会更改为此。

    { "_id" : 10000, "data" : BinData(0,"ADRAAAAAPiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA="), "size" : 20 }
    

    大小字段确实正确,但数据字段不正确。

  6. 奇怪的是,如果你只转储一个 oplog 并重放它,数据会是正确的。

    mongodump --port 27017 -d local -c oplog.rs --query '{"ts" : Timestamp(1435627144, 1)}' -o ./tmpD/
    
    mv ./tmpD/local/oplog.rs.bson ./tmpR/oplog.bson
    
    mongorestore --port 27017 --oplogReplay ./tmpR/
    

    oplog 重播后,'data' 字段是完全正确的。

    { "_id" : 10000, "data" : BinData(0,"CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA="), "size" : 10 }
    

    为什么会发生这种奇怪的事情?

4

1 回答 1

1

它已在此提交中修复。

https://github.com/mongodb/mongo-tools/commit/ed60bbfae7d2b5239bea69f162f0784e17995e91

跟踪 JIRA 中的错误报告。

https://jira.mongodb.org/browse/TOOLS-807

于 2015-11-11T16:30:47.507 回答