Mongodb版本2.2.1
場景:
mongo數據庫test分片已經啟用,在新增加一個collection之后,並且該表已經有數據寫入,當對該表啟用分片的時候報錯:please create an index that starts with the shard key before sharding
大概意思是在啟用分片前需要在分片key上建立索引。我並沒有立刻在分片key上建立索引,因為之前在啟用表分片,在分片key上會自動建立索引,為什么要我手動建立呢?所以先google之看有沒有相關資料,沒想到搜索的結果大失所望,總共才5條結果。2條英文結果,3條日文。第一條好像是mongodb源碼,當時沒注意。沒辦法只能看下根據提示關鍵字搜索下mongodb源碼,在src/mongo/s/commands_admin.cpp文件中544行找到這個錯誤信息
雖然C++在大學時只學了皮毛,看看判斷還是可以的....原來判斷分支是查找是否有可用的索引存在,當無可用的索引,並且表不為空時,就會出現這個錯誤信息。
好了找到根源了,現在解決問題:在分片key上個建立索引
use test db.ttl.ensureIndex({date:1,node_id:1})
然后對表進行分片
sh.shardCollection('test.ttl',{date:1,node_id:1})
結果顯示:
{ "collectionsharded" : "test.ttl", "ok" : 1 }
OK.至此問題解決.