Mongodb

在 MongoDB 分片集群中恢復數據庫有什麼特別之處?

  • September 20, 2013

我想將一個數據庫從一個副本集遷移到另一個屬於分片集群的數據庫。到目前為止,這個集群只有 1 個 shard,沒有任何集合或數據庫是真正的 sharded。

我 mongodumped 並恢復了這個數據庫。從分片集群的一個 mongos 中,我可以執行一個簡單的查詢,例如 find(),但包括如下投影在內的內容不再起作用:

“find({“var1”:subvar},{"_id”:0, “fld1”:1, “fld2”:1, “fld3”:1}).limit(1).sort("_id",pymongo .降序)"

我收到以下錯誤消息:

數據庫錯誤:必須在投影中有排序鍵並將其刪除

這一定是與分片相關的問題,因為我將此數據庫恢復到開發獨立的 mongodb 伺服器並且測試成功執行。

提前致謝,

格雷格。

這不是 mongorestore 的問題。如果您在 2.2+ 的分片數據庫中創建新集合,您將看到相同的行為。

mongos> db.version()
2.2.6
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({}, {id:0}).sort({id:1})
error: {
       "$err" : "have to have sort key in projection and removing it",
       "code" : 13431
}

顯然行為在 2.0 中有所不同。

mongos> db.version()
2.0.9
mongos> db.foo.save({id:3, value:'c'})
mongos> db.foo.save({id:2, value:'b'})
mongos> db.foo.save({id:1, value:'a'})
mongos> db.foo.find({},{id:0}).sort({id:1})
{ "_id" : ObjectId("523bd35dff9a7c468936efba"), "value" : "a" }
{ "_id" : ObjectId("523bd358ff9a7c468936efb9"), "value" : "b" }
{ "_id" : ObjectId("523bd352ff9a7c468936efb8"), "value" : "c" }

我打開了SERVER-10381看看如果你想關注它是否是預期的。

編輯:這是預期的。當查詢通過 mongos 執行時,key 應該存在,以便可以合併和排序來自各個分片的結果。在 2.2 之前,單個 shard/unsharded 集合的邏輯明顯不同,但為了一致性而改變了。

將更新文件以反映他的限制。

引用自:https://serverfault.com/questions/540127