本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
索引故障排除
以下主题说明了索引或后台索引构建失败时的操作。
索引构建失败
在索引创建过程中,Amazon DocumentDB 将使用实例上的本地存储。您可以使用FreeLocalStorage CloudWatch 指标 (CloudWatch -> Metrics -> DocDB -> Instance Metrics
) 监控此磁盘使用情况。如果索引构建用尽所有本地磁盘并且失败,您将收到错误。将数据迁移到 Amazon DocumentDB 时,我们建议您先创建索引,然后插入数据。有关迁移策略和创建索引的更多信息,请参阅 Amazon DocumentDB 文档中的 迁移到 Amazon DocumentDB 和博客文章:使用离线方法从 MongoDB 迁移到 Amazon DocumentDB
在现有集群上创建索引时,如果索引构建花费的时间超过预期或构建失败,我们建议您扩展实例来创建索引,创建好索引后,再缩减回来。Amazon DocumentDB 使您能够使用 Amazon Web Services Management Console 或在几分钟内快速扩展实例大小。 Amazon CLI有关更多信息,请参阅 管理实例类。使用每秒实例定价时,您只需为使用 1 秒以上的资源付费。
后台索引构建延迟问题和失败
Amazon DocumentDB 中后台索引构建直到索引构建发起之前启动的主实例上所有查询都完成执行后才启动。如果有长时间运行的查询,则后台索引构建将阻塞,直到查询完成为止,因此可能耗时比预期完成时间更长。即使集合为空也如此。
前台索引构建并不展现出相同的阻塞行为。取而代之,前台索引构建对集合进行独占锁定,直至完成索引构建为止。因此,要在空集合上创建索引并避免在任何长时间运行的查询上阻塞,我们建议使用前台索引构建。
注意
在任何给定时间,Amazon DocumentDB 只允许在一个集合中构建一个后台索引。如果后台索引构建期间在相同集合上出现 DDL(数据定义语言)操作(如 createIndex()
或 dropIndex()
),后台索引构建将失败。
数据库索引膨胀
Amazon DocumentDB 使用多版本并发控制 (MVCC) 来管理并发交易。删除或更新文档后,其先前版本将作为 “失效” 版本保留在集合和索引中。垃圾收集过程会自动从这些失效版本中回收空间以备将来操作。
当集合的索引因失效或过时的索引条目积累或页面中的碎片而变大时,就会出现索引膨胀。报告的百分比表示 future 索引条目可以使用的索引空间量。这种膨胀会消耗缓冲区缓存和存储空间中的空间。如果要删除膨胀,则需要重建索引。
例 示例
运行以下命令来确定索引的未使用存储空间:
db.coll.aggregate({$indexStats:{}});
结果如下所示:
{ "name" : "_id_", "key" : { "_id" : 1 }, "host" : "devbox-test.localhost.a2z.com:27317", "size" : NumberLong(827392), "accesses" : { "ops" : NumberLong(40000), "docsRead" : NumberLong(46049), "since" : ISODate("2025-04-03T21:44:51.251Z") }, "cacheStats" : { "blksRead" : NumberLong(264), "blksHit" : NumberLong(140190), "hitRatio" : 99.8121 }, "unusedStorageSize" : { "unusedSizeBytes" :
409600
, "unusedSizePercent" :49.51
} }
使用该reIndex
命令无需停机即可重建索引,该命令需要扫描整个集合。请参阅使用索引维护 reIndex。