一日一技: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)

杀掉进程。

而后从新建立后台索引便可。

相关文章
相关标签/搜索