MongoDB在执行createIndex或reIndex方法在创建或重构索引时,将阻塞对数据集合的操作,更为严重的是,对整个数据库都有影响,直到索引创建或重构完成,方可操作。
如在其过程中意外中断,再次重启mongodb时会发现,无法启动,查看monggo日志发现:
如图,启动不起来是因为mongo在后台创建索引未曾执行完毕。针对此问题,可以使用storage.indexBuildRetry or --noIndexBuildRetry跳过索引创建来启动。
如:我采用的是mongo集群,日志中只要是分片10中表在创建索引导致分片10无法顺利启动,最简单的办法就是在启动分片10时增加 --noIndexBuildRetry跳过索引创建来启动:
numactl --interleave=all mongod -f /data4/mongodb7010/conf/shard7010.conf --noIndexBuildRetry
如下图:
启动完成后,进入相应数据库连接主节点,定位创建(重构)索引的进程:
db.currentOp()
然后执行:
db.killOp(<opid>)
终止索引创建。