一日一技:MongoDB如何正確中斷正在建立的索引

一日一技:MongoDB如何正確中斷正在建立的索引

一日一技:MongoDB如何正確中斷正在建立的索引

攝影:產品經理
廚師:kingname
咱們在使用 MongoDB 的時候,會出現須要給一個已經存在的大集合的某個字段增長索引的狀況。ide

索引分爲前臺索引和後臺索引,對應到 pymongo 中建立索引的代碼:3d

import pymongo
handler = pymongo.MongoClient().yourdb.yourcol
# 前臺索引
handler.create_index('字段名')
# 後臺索引
handler.create_index('字段名', background=True)

若是集合裏面有不少數據,而且你使用的是前臺索引,那麼此時,建立索引會把這個集合鎖起來,全部對這個集合的寫入操做都會掛起。直到索引建立完成爲止。若是使用的是後臺索引,那麼建立索引的過程不會影響數據寫入。code

但有時候,原本想建立後臺索引,卻忘記加 background=True參數。此時怎麼辦?由於大集合建立索引有時候可能須要好幾個小時,掛起的寫入數據會堆積在內存裏面,把內存撐爆。blog

此時,千萬不要重啓 MongoDB,由於重啓之後,以前沒有完成的索引建立操做,依然會自動啓動繼續建立。索引

正確的作法是殺掉建立索引的進程。進程

此時,咱們能夠在 MongoDB Shell 或者 Robo 3T裏面操做。內存

這裏以 Robo 3T爲例,首先打開對應的集合,以下圖所示:產品

一日一技:MongoDB如何正確中斷正在建立的索引

而後把命令欄裏面的內容修改成:it

db.currentOp()

返回的內容以下圖所示:
一日一技:MongoDB如何正確中斷正在建立的索引class

建立索引的進程,能夠在參數裏面看到相似於

"lockType": "write"

這樣的字字段。在它附近,能夠找到一個字段叫作 opid。

而後在命令欄輸入命令:

db.killOp(opid)

殺掉進程。

而後從新建立後臺索引便可。

相關文章
相關標籤/搜索