オプション --oplogReplay を指定して mongorestore を使用して oplog を再生すると、mongorestore が binData フィールドの set 操作を処理できないという奇妙なエラーが見つかりました。これを行うと、同じエラーが発生する可能性があります。
テストデータを挿入します。
db.testData.insert({_id: 10000, data: BinData(0, ""), size: 10})
binData フィールドを更新します。
db.testData.update({_id: 10000}, {$set: {data: BinData(0, "CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA=")}})
他のフィールドを更新する
db.testData.update({_id: 10000}, {$set: {size: 20}})
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 } }
これら 2 つの 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 }
サイズ フィールドは本当に正しいのですが、データ フィールドが正しくありません。
最も奇妙なことは、 oplog を1 つだけダンプして再生すると、データが正しいことです。
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 が再生された後、「データ」フィールドは非常に正確です。
{ "_id" : 10000, "data" : BinData(0,"CgxVfs93PiT/DrxMSvASFgoNMTAuMTYwLjIyMi4xMhDEJxgKIAA="), "size" : 10 }
なぜこの奇妙なことが起こるのですか?