Docs 菜单

compact

compact

对集合中的所有数据和索引进行重写和碎片整理。 在 WiredTiger数据库上,此命令将发布不需要的磁盘空间给操作系统。

此命令可用于以下环境中托管的部署:

重要

M0、M2、M5 和 Flex 集群不支持此命令。有关更多信息,请参阅不支持的命令。

该命令具有以下语法:

db.runCommand(
{
compact: <collection name>
}
)

该命令接受以下字段:

注意

从 MongoDB 4.2 开始

MongoDB删除了 MMAPv1storage engine 以及 的 MMAPv1 特定选项paddingFactor 、 、{4paddingBytes preservePaddingcompact}。

字段
类型
说明

compact

字符串

集合的名称。

force

flag

可选。 从 v4.4 开始,如果指定,将强制compact 在副本集的主节点 (primary node in the replica set)上运行。在4 v.4 之前,如果值为 ,则此布尔字段允许compact 在副本集的主节点 (primary node in the replica set)上运行;如果值为 truefalse,则在主节点 (primary node in the replica set)上运行时返回错误,因为该命令阻止了所有其他操作。

从 v4.4 开始, compact不会区块正在压缩的数据库上的MongoDB 增删改查操作。

comment

any

可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:

注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。

对于强制执行身份验证的集群,您必须以对目标集合具有compact操作权限的用户身份进行身份验证。 dbAdmin角色提供对非系统集合运行compact所需的特权。

有关如何配置 resource 文档的详细信息,请参阅有关自管理部署的资源文档。

要将 dbAdmin 或自定义角色添加到现有用户,请使用 db.grantRolesToUser()db.updateUser()。以下操作在 admin 数据库上将自定义 compact 角色授予 myCompactUser

use admin
db.grantRolesToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )

要向新用户添加 dbAdmin 或自定义角色,请在创建用户时对 db.createUser() 方法的 roles 数组指定该角色。

use admin
db.createUser(
{
user: "myCompactUser",
pwd: "myCompactUserPassword",
roles: [
{ role: "dbAdmin", db: "<database>" } | "myCustomCompactRole"
]
}
)

要检查 compact 操作的进度,请监控 mongod 日志文件或从另一个 shell 实例运行 db.currentOp()

如果使用 db.killOp() 方法终止 compact,或在操作完成之前重新启动服务器,则 compact 将结束,并且可能无法尝试将磁盘空间释放回操作系统。

compact 命令尝试通过将过时的块释放回操作系统来减少集合中的数据和索引消耗的磁盘空间。 compact 的有效性与可供释放的区块数量以及这些区块在数据文件中的位置有关。

要查看集合的存储空间如何变化,请在压实之前和之后运行collStats 命令。您可以使用输出指标collStats.freeStorageSize 来查看可供重复使用的存储量。

该操作是迭代式的,并在每次遍历中对数据文件的分段进行操作。 要查看 compact 将发布多少空间的估计值,请使用 dryRun 标志。 对集合调用 compact 将压缩该集合及其关联的索引。

compact 可能需要额外的磁盘空间才能运行。

您可以在存储在副本集中的集合和索引上使用 compact,但有一些重要的注意事项:

  • 主节点不会将 compact 命令复制到从节点。

  • 尽可能在从节点上运行 compact。如果无法在从节点上运行 compact,请参阅 force 选项。

  • 从 MongoDB 6.0.2开始 (和5.0.12 ):

    • 从节点可以在 compact 运行时进行复制。

    • 允许读取。

在集群上运行 compact

1

在其中一个从节点上运行 compact。当 compact 完成后,依次对剩余的每个从节点重复该操作。

2

要降级当前主节点并触发选举,请使用 rs.stepDown() 方法。要指定特定的从节点,请调整节点优先级

3

降级后,旧的主节点将成为从节点。在旧的主节点上运行 compact

从节点上的阻塞行为与版本有关。

版本

阻止行为

4.4

  • 无法进行复制。

  • 不允许读取。

版本 4.4.17、 5.0.12 和 6.0.2

  • 从节点可以在 compact 运行时进行复制。

  • 允许读取。

运行 compact 命令时,副本集将保持 SECONDARY 状态。

有关副本集成员状态的更多信息,请参阅副本集成员状态

有关副本集维护和可用性,请参阅对自管理副本集节点进行维护。

compact仅适用于mongod实例。 在分片环境中,在每个分片上分别运行compact作为维护操作。

您无法针对 实例发出compact mongos

mongodcompact操作之后并行重建所有索引。