ошибка при использовании mongorestore для воспроизведения oplog с полем binData

При использовании mongorestore с параметром --oplogReplay для воспроизведения оплогов я обнаружил странную ошибку, заключающуюся в том, что 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. проверить с оплогом

    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. сбрось эти два оплога и воспроизведи их

    В оболочке 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. Самым странным было бы вот что: если вы дампите только один оплог и воспроизводите его, данные будут правильными.

    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/
    

    После воспроизведения оплога поле «данные» отображается правильно.

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

    Почему происходит эта странная вещь?


person Jonathan Lee    schedule 28.06.2015    source источник
comment
какую версию монгода вы использовали в то время? 3.0 вроде, а какой релиз, если помните?   -  person Asya Kamsky    schedule 07.12.2015


Ответы (1)


Это было исправлено в этом коммите.

https://github.com/mongodb/mongo-tools/commit/ed60bbfae7d2b5239bea69f162f0754e979a>

Отследите отчет об ошибке в JIRA.

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

person Jonathan Lee    schedule 11.11.2015