

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 索引故障排除
<a name="troubleshooting.index-creation"></a>

以下主题说明了索引或后台索引构建失败时的操作。

**Topics**
+ [索引构建失败](#troubleshooting.index-build-fails)
+ [后台索引构建延迟问题和失败](#troubleshooting.background-index-build-fails)
+ [数据库索引膨胀](#troubleshooting-database-bloat)

## 索引构建失败
<a name="troubleshooting.index-build-fails"></a>

在索引创建过程中，Amazon DocumentDB 将使用实例上的本地存储。您可以使用**FreeLocalStorage** CloudWatch 指标 (`CloudWatch -> Metrics -> DocDB -> Instance Metrics`) 监控此磁盘使用情况。如果索引构建用尽所有本地磁盘并且失败，您将收到错误。将数据迁移到 Amazon DocumentDB 时，我们建议您先创建索引，然后插入数据。有关迁移策略和创建索引的更多信息，请参阅 Amazon DocumentDB 文档中的 [迁移到 Amazon DocumentDB](docdb-migration.md) 和博客文章：[使用离线方法从 MongoDB 迁移到 Amazon DocumentDB](https://aws.amazon.com/blogs/database/migrate-from-mongodb-to-amazon-documentdb-using-the-offline-method/)。

在现有集群上创建索引时，如果索引构建花费的时间超过预期或构建失败，我们建议您扩展实例来创建索引，创建好索引后，再缩减回来。Amazon DocumentDB 使您能够使用 AWS 管理控制台 或在几分钟内快速扩展实例大小。 AWS CLI有关更多信息，请参阅 [管理实例类](db-instance-classes.md)。使用每秒实例定价时，您只需为使用 1 秒以上的资源付费。

## 后台索引构建延迟问题和失败
<a name="troubleshooting.background-index-build-fails"></a>

Amazon DocumentDB 中后台索引构建直到索引构建发起之前启动的主实例上所有查询都完成执行后才启动。如果有长时间运行的查询，则后台索引构建将阻塞，直到查询完成为止，因此可能耗时比预期完成时间更长。即使集合为空也如此。

前台索引构建并不展现出相同的阻塞行为。取而代之，前台索引构建对集合进行独占锁定，直至完成索引构建为止。因此，要在空集合上创建索引并避免在任何长时间运行的查询上阻塞，我们建议使用前台索引构建。

**注意**  
在任何给定时间，Amazon DocumentDB 只允许在一个集合中构建一个后台索引。如果后台索引构建期间在相同集合上出现 DDL（数据定义语言）操作（如 `createIndex()` 或 `dropIndex()`），后台索引构建将失败。

## 数据库索引膨胀
<a name="troubleshooting-database-bloat"></a>

Amazon DocumentDB 使用多版本并发控制（MVCC）来管理并发事务。删除或更新文档后，其先前版本将作为“失效”版本保留在集合和索引中。垃圾回收过程会自动从这些失效版本中回收空间以用于未来的操作。

当集合的索引因失效或过时的索引条目累积或页面内的碎片累积而变大时，就会出现索引膨胀。报告的百分比表示未来索引条目可以使用的索引空间量。此膨胀会同时消耗缓冲区缓存和存储空间中的空间。如果要消除膨胀，则需要重建索引。

**Example 示例**  
运行以下命令以确定索引未使用的存储空间：  

```
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` 进行索引维护](managing-indexes.md#reIndex)。