

### 调查报告

#### 引言
本文详细探讨了如何在不影响 MongoDB 实际数据的情况下，通过删除文件来释放存储空间。基于用户提供的文件列表，我们分析了每个文件的用途，并提供了安全删除的建议。这份报告旨在为用户提供全面的指导，同时强调手动操作的风险，并推荐更安全的替代方法。

#### 文件分析与分类
用户提供的文件列表包括多种类型的文件，如 `WiredTiger.wt`、`collection-*`、`index-*` 等。这些文件是 MongoDB 使用 WiredTiger 存储引擎时的数据目录中的典型组成部分。以下是详细分析：

- **实际数据文件**：
  - `collection-*` 文件（如 `collection-0-1702428478038935225.wt`）存储集合中的文档数据。删除这些文件将导致数据丢失，因此绝对不能删除。
  - 示例：`collection-0--1757014832397380742.wt`、`collection-4--3349146543354658687.wt`。

- **索引文件**：
  - `index-*` 文件（如 `index-5-1702428478038935225.wt`）存储集合的索引。删除这些文件不会影响实际数据，但会移除索引，可能显著降低查询性能，尤其是对于复杂的查询。
  - 示例：`index-0--3349146543354658687.wt`、`index-6--3597060289595503483.wt`。
  - 研究表明，索引文件的大小可能占数据目录的很大一部分，删除它们可以释放显著的空间，但需要权衡性能影响。

- **元数据和核心文件**：
  - `WiredTiger.wt` 是数据库的主要元数据文件，存储所有表的配置和检查点信息。删除它会导致数据库无法启动，绝对不能删除。
  - `WiredTigerHS.wt` 是事务历史存储文件，用于支持事务完整性，删除可能导致事务相关问题。
  - `_mdb_catalog.wt` 是目录文件，包含数据库的元数据，删除会导致数据库不可用。
  - `sizeStorer.wt` 存储大小信息，删除可能会影响空间管理，启动时可能出错。

- **锁文件**：
  - `WiredTiger.lock` 和 `mongod.lock` 是锁文件，用于防止多个实例同时访问数据库。手动删除可能导致数据损坏，不建议删除。

- **日志和临时文件**：
  - `journal` 文件用于写前日志，确保崩溃恢复时的数据一致性。删除它们风险很高，可能导致数据丢失或不一致，不建议手动操作。
  - `_tmp` 文件是临时文件，通常用于操作过程中。如果数据库当前未运行或没有正在进行的操作，删除它们可能是安全的。
  - `diagnostic.data` 文件包含诊断信息（如服务器状态的二进制格式），用于故障排查。删除它不会影响数据，但可能会影响未来的问题诊断。

- **不明文件**：
  - `storage.bson` 在标准 MongoDB 数据目录中不常见，可能是用户自定义文件或备份文件。未经确认用途，不建议删除，以免影响数据。

#### 安全删除的建议
基于上述分析，以下是可以在不影响实际数据的情况下考虑删除的文件：
- **`diagnostic.data`**：这是诊断信息文件，不包含实际数据，删除是安全的。如果空间紧张且不需要诊断信息，可以删除。
- **`_tmp` 文件**：这些是临时文件，如果数据库未运行或确认没有正在进行的操作，可以删除。但需注意，删除过程中可能影响正在进行的操作。

#### 删除索引文件的权衡
如果需要更多空间，可以考虑删除 `index-*` 文件，但需注意以下几点：
- 删除索引文件会移除对应的索引，这不会影响实际数据（文档），但会显著降低查询性能，尤其是依赖索引的查询。
- 示例文件：`index-5--3349146543354658687.wt`、`index-8--3597060289595503483.wt`。
- 建议：如果某些索引不再需要（例如，开发环境或不再使用的查询），可以删除对应的文件。但在生产环境中，建议先评估性能影响。

#### 不建议删除的文件
以下文件不建议删除，因为它们对数据库的正常运行至关重要：
- `collection-*` 文件：包含实际数据，删除会导致数据丢失。
- `WiredTiger.wt`、`WiredTigerHS.wt`、`sizeStorer.wt`：这些是核心元数据和历史文件，删除会导致数据库无法启动或数据不一致。
- `journal` 文件：用于崩溃恢复，删除可能导致数据丢失。
- `WiredTiger.lock` 和 `mongod.lock`：锁文件，删除可能导致多实例访问冲突。

#### 替代方法：使用 `compact` 命令
手动删除文件存在风险，推荐使用 MongoDB 的 `compact` 命令来安全回收空间。该命令会重写数据和索引，释放未使用的磁盘空间，尤其适合 WiredTiger 存储引擎。操作步骤如下：
1. 连接到 MongoDB 实例，使用 `mongosh`。
2. 对每个集合运行 `db.collection.compact()`，例如 `db.myCollection.compact()`。
3. 注意：`compact` 操作需要额外的磁盘空间（约 2GB），并会锁定数据库，建议在维护窗口期间执行。

有关详细信息，请参考 [MongoDB 官方文档](https://www.mongodb.com/docs/manual/tutorial/compact-collections/)。

#### 风险与注意事项
- **手动删除的风险**：MongoDB 的文件系统高度集成，删除错误文件可能导致数据库损坏或数据丢失。建议在操作前备份所有文件。
- **诊断信息的重要性**：`diagnostic.data` 文件虽然可以删除，但如果未来需要排查问题，可能会缺少关键信息。
- **性能影响**：删除索引文件会影响查询性能，建议在删除前评估业务需求。

#### 表格：文件类型与删除建议

| 文件类型          | 示例文件                          | 包含内容                     | 是否可以删除       | 影响                     |
|-------------------|-----------------------------------|------------------------------|--------------------|--------------------------|
| 集合数据文件      | `collection-0-1702428478038935225.wt` | 实际文档数据                 | 否                 | 数据丢失                 |
| 索引文件          | `index-5-1702428478038935225.wt`   | 索引数据                     | 是（谨慎）         | 查询性能下降             |
| 元数据文件        | `WiredTiger.wt`                   | 数据库配置和检查点           | 否                 | 数据库无法启动           |
| 历史存储文件      | `WiredTigerHS.wt`                 | 事务历史                     | 否                 | 事务完整性问题           |
| 临时文件          | `_tmp`                            | 临时操作数据                 | 是（数据库未运行时）| 可能影响正在进行的操作   |
| 诊断文件          | `diagnostic.data`                 | 服务器状态信息               | 是                 | 未来诊断可能困难         |
| 日志文件          | `journal`                         | 写前日志，用于崩溃恢复       | 否                 | 数据不一致或丢失         |
| 锁文件            | `WiredTiger.lock`                 | 防止多实例访问               | 否                 | 数据损坏风险             |
| 大小存储文件      | `sizeStorer.wt`                   | 空间大小信息                 | 否                 | 启动可能失败             |
| 不明文件          | `storage.bson`                    | 未知，可能是自定义文件       | 否（未经确认）     | 可能影响数据             |

#### 结论
为了释放空间，建议首先删除 `diagnostic.data` 和 `_tmp` 文件，这些操作相对安全，不会影响实际数据。如果需要更多空间，可以考虑删除 `index-*` 文件，但需权衡性能影响。强烈建议避免手动删除 `journal` 文件和其他核心文件，并优先使用 `compact` 命令来安全回收空间。
