文档菜单
文档首页
/
MongoDB 手册
/ / /

compact

本页

  • 定义
  • 兼容性
  • 语法
  • 命令字段
  • compact所需权限
  • 行为
  • 示例
  • 了解更多
compact

尝试释放未使用的磁盘空间到操作系统。

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

  • MongoDB Atlas:云中MongoDB部署的完全托管服务

重要

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

  • MongoDB Enterprise:基于订阅、自我管理的MongoDB版本

  • MongoDB Community:源代码可用、免费使用和自我管理的MongoDB版本

该命令具有以下语法

db.runCommand(
{
compact: <string>,
dryRun: <boolean>,
force: <boolean>, // Optional
freeSpaceTargetMB: <int>, // Optional
comment: <any>, // Optional
}
)

该命令包含以下字段

字段
类型
描述
compact
string
集合的名称。
dryRun
boolean

New版本8.0.

如果启用,则compact命令将返回从目标集合中可以回收多少空间(以字节为单位)。如果使用compactdryRun设置为true,MongoDB只返回估计值而不执行任何压缩操作。

默认值: False

force
boolean

已更改版本4.4.

可选。如果启用,强制compact主节点上运行一个副本集。在压缩的数据库上,compact不会阻止MongoDB CRUD操作

freeSpaceTargetMB
Integer

可选。指定必须可恢复的最小存储空间量(以兆字节为单位),以便压缩操作可以继续。

默认 20

注释
任何

可选。用户提供的注释,用于附加到此命令。一旦设置,此注释将出现在以下位置的此命令记录旁边:

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

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

对于系统集合,您必须

  1. 创建一个自定义角色,该角色授予系统集合上的compact动作。

  2. 将此角色授予新用户或现有用户。

  3. 以该用户身份进行身份验证以执行compact命令。

例如,以下操作创建一个自定义角色,授予对指定数据库和集合的compact动作

use admin
db.createRole(
{
role: "myCustomCompactRole",
privileges: [
{
resource: { "db" : "<database>" , "collection" : "<collection>" },
actions: [ "compact" ]
}
],
roles: []
}
)

有关配置resource文档的更多信息,请参阅自管理部署上的资源文档。

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

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

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

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

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

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

要查看集合的存储空间变化,请在压缩前后运行 collStats 命令。

WiredTiger 上,compact 尝试减少集合中数据和索引所需的存储空间,将不需要的磁盘空间释放给操作系统。此操作的有效性取决于工作负载,并且可能无法恢复任何磁盘空间。如果已从集合中删除了大量数据,并且不计划替换它,则此命令很有用。

compact 在 WiredTiger 数据库上运行可能需要额外的磁盘空间。

压缩会定期检查点数据库,这可能导致同步开销。在高流量数据库上,这可能会延迟或阻止操作任务,如备份。为了避免意外中断,在备份前禁用压缩。

您可以在存储在副本集中的集合和索引上使用 compact,但有一些重要考虑因素。

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

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

  • 从 MongoDB 6.1.0 开始(包括 6.0.2 和 5.0.12)

    • 当运行 compact 时,从节点可以复制。

    • 允许读取。

在集群上运行 compact

1

在某个从节点上运行 compact。当 compact 完成后,依次在每个剩余的从节点上重复此操作。

2

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

3

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

  • 当运行 compact 时,从节点可以复制。

  • 允许读取。

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

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

有关副本集维护和可用性,请参阅 在自管理副本集成员上执行维护。

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

您不能向 mongos 实例发出 compact

mongod 在执行 compact 操作后并行重建所有索引。

如果您在同一集合上尝试运行多个并发 compact 命令,MongoDB 将返回错误。

以下操作在 movies 集合上运行 compact 命令

db.runCommand( { compact: "movies" } )
{ bytesFreed: 27859, ok: 1 }

以下操作在 movies 集合上对 compact 命令进行干运行

db.runCommand( {
compact: "movies",
dryRun: true
} )
{ estimatedBytesFreed: 27859, ok: 1 }

返回

collMod