mongodb移除分片删除分片上資料庫和添加分片
2018年01月12日 19:09:23 冰雪Love齊迹 閱讀數 5369更多
分類專欄: mongodb學習
版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協定,轉載請附上原文出處連結和本聲明。
本文連結:https://blog.csdn.net/liqi_q/article/details/79047361
首先我們要移除的分片之後再次添加此分片時會出現添加失敗的情況,需要在添加的分片上登入進行删除此分片之前資料庫的曆史資料比如testdb,删除分片上的資料庫之後就可重新添加此分片到mongos中

1、執行RemoveShard指令
db.runCommand( { removeshard: "your_shard_name" } )
{ msg : "draining started successfully" , state: "started" , shard :"mongodb0" , ok : 1 }
“注意:該指令至少執行兩次才能成功删除,執行到state為completed才真正删除,否則就是沒用删除成功,該分片處于"draining" : true狀态,該狀态下不但該分片沒用删除成功,而且還影響接下來删除其他分片操作,遇到該狀态再執行一次removeshard即可,最好就是删除分片時一直重複執行删除指令,直到state為completed;
還有一個需要注意的地方就是:被成功删除的分片如果想要再加入叢集時,必須将data資料目錄清理幹淨才可以再加入叢集,否則即使能加入成功也不會存儲資料,集合都不會被建立
另外:在删除分片的時有可能整個過程出現無限"draining" : true狀态,等多久還是這樣,而且分片上面的塊一個都沒有移動到别的分片,解決辦法是:在config的config資料庫的shard集合中找到該分片的資訊,并将draining字段由True改為False,再繼續試着删除操作”
上面這句會立即傳回,實際在背景執行。
2、檢視遷移狀态
我們可以反複執行上面語句,檢視執行結果。
db.runCommand( { removeshard: "your_shard_name" } ) { msg: "draining ongoing" , state: "ongoing" , remaining: { chunks: 42, dbs : 1 }, ok: 1 }
從上面可以看到,正在遷移,還剩下42塊沒遷移完。
當remain為0之後,這一步就結束了。
3、移出非Shard資料(如果開始就知道是primary可以直接執行 步驟3和4即可,1和2不需要執行)
如果你要删除的Shard分片恰好是primary,那麼執行這一步,否則請跳過!
db.runCommand( { movePrimary: "資料庫名稱", to: "分片名稱" })
這次就不是立即傳回了,需要很久,然後會傳回如下:
{ "primary" : "mongodb1", "ok" : 1 }
4、最後的清理
上面步驟都完成後,還需要再執行一次RemoveShard,清理殘餘資料。
db.runCommand( { removeshard: "mongodb0" } )
執行成功後,會如下結果:
{ msg: "remove shard completed succesfully" , stage: "completed", host: "mongodb0", ok : 1 }
顯示completed後,就可以安心的關閉mongod的程序了。