mongodb 索引构建失败与恢复
主节点 mongod 上的索引构建中断
从 MongoDB 5.0 开始,如果主节点 mongod 使用 "force" : true 执行干净的 shutdown 或在索引构建期间收到 SIGTERM 信号,并且 commitQuorum 设置为默认 votingMembers,则索引构建进度将保存到磁盘。mongod 在重新启动时会自动恢复此索引构建,并从保存的检查点继续运行。在早期版本中,如果索引构建中断,就必须从头重新开始。
从节点 mongod 上的索引构建中断
从 MongoDB 5.0 开始,如果从节点 mongod 使用 "force" : true 执行干净的 shutdown 或在索引构建期间收到了 SIGTERM 信号,并且 commitQuorum 设置为默认 votingMembers,则索引构建进度将保存到磁盘。mongod 在重新启动时会自动恢复该索引构建,并从已保存的检查点继续运行。在早期版本中,如果索引构建已中断,则必须从头重新开始。
mongod 可以在恢复索引构建的同时执行启动过程。
如果以独立模式重新启动 mongod(即删除或注释掉 replication.replSetName 或省略 --replSetName),则 mongod 无法重新启动索引构建。该构建将保持暂停状态,直到手动执行 dropped。
独立 mongod 上的索引构建中断
如果 mongod 在索引构建期间关闭,则索引构建作业和所有进度都将丢失。重新启动 mongod 不会重新启动索引构建。必须重新执行 createIndex() 操作,才能重新启动索引构建过程。
构建进程中的回滚
从 MongoDB 5.0 开始,如果在索引构建期间某一节点回滚到之前的状态,则会将索引构建进度保存到磁盘。如果回滚结束时仍有工作要做,mongod 则会自动恢复索引构建,并从保存的检查点继续运行。
MongoDB 可以暂停正在进行的索引构建,以执行回滚。
如果回滚没有撤销索引构建进度,MongoDB 会在完成回滚后重新启动索引构建作业。
如果回滚操作撤销了索引构建进度,您必须在回滚完成后重新创建一个或多个索引。
分片集合的索引一致性检查
如果一个分片集合在包含集合数据块的每个分片上没有完全相同的索引(包括索引选项),则该集合的索引不一致。尽管一般操作过程中不应出现索引不一致的情况,但这种情况仍有可能发生,例如:
当用户使用
unique键约束创建索引,且一个分片包含具有重复文档的数据段时。在此类情况下,创建索引操作可能会对没有重复项的分片成功完成,而对有重复项的分片失败。当用户以滚动方式跨分片创建索引(即在分片中逐个手动构建索引),但未能为关联分片构建索引或错误地构建了具有不同规范的索引。
配置服务器主节点会定期检查分片集合的分片之间的索引不一致情况。要配置这些定期检查,请参阅 enableShardedIndexConsistencyCheck 和 shardedIndexConsistencyCheckIntervalMS。
在配置服务器主节点上运行时,命令 serverStatus 返回字段 shardedIndexConsistency 以报告索引不一致的情况。
要检查分片集合是否存在不一致的索引,请参阅查找分片间不一致的索引。
监控进行中的索引构建
要查看索引构建操作的状态,可以使用 mongosh 中的 db.currentOp() 方法。要过滤索引创建操作的当前操作,请参阅主动创建索引的操作,查看相关示例。
msg 字段包括了索引构建过程中当前阶段的完成百分比测量值。
查看日志中已停止和已恢复的索引构建过程
构建索引时,进度会写入 MongoDB 日志。如果索引构建已停止并恢复,则会出现包含如下字段的日志消息:
"msg":"Index build: wrote resumable state to disk",
"msg":"Found index from unfinished build",
终止正在进行的索引构建
使用 dropIndexes 命令或其 Shell 助手 dropIndex() 或 dropIndexes() 来终止正在进行的索引构建。有关更多信息,请参阅停止正在进行的索引构建。
请勿 使用 killOp 终止副本集或分片集群中正在进行的索引构建。




