Docs 菜单
Docs 主页
/ /

compact(数据库命令)

compact

尝试将不需要的磁盘空间释放给操作系统。

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

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

重要

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

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

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

该命令具有以下语法:

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

该命令接受以下字段:

字段
类型
说明

compact

字符串

集合的名称。

dryRun

布尔

8.0版本新增

如果启用,compact 命令将返回压缩可以从目标集合中回收的空间大小(以字节为单位)的估计值。如果在 dryRun 设置为 true 的情况下运行 compact,MongoDB 只返回估计值,而不执行任何类型的压缩。

默认值:False

force

布尔

可选.如果启用,则强制 compact副本集的主节点 (primary node in the replica set)上运行。

freeSpaceTargetMB

整型

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

默认值:20

comment

any

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

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

注意

compact 命令不会区块正在压缩的数据库上的MongoDB 增删改查操作

对于强制进行身份验证的集群,您必须使用对目标集合执行 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()。以下操作在 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()

如果使用 方法终止compact db.killOp()或在操作完成之前重新启动服务器,compact 则会结束。该操作可能不会将磁盘空间发布回操作系统。

compact 命令通过向操作系统释放过时的块来减少集合中数据和索引的磁盘空间。有效性取决于可供发布的区块数量及其在数据文件中的位置。

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

该操作是迭代式的,在每次遍历中都处理数据文件的各个分段。要估计 compact 释放了多少空间,请使用 dryRun 标志。对集合调用 compact 会压缩该集合及其关联的索引。

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

压实会定期对数据库设置检查点,这可能会导致同步开销。在高流量数据库上,这可能会产生延迟或阻止备份等操作任务。为避免意外中断,请在进行备份之前禁用压实。

注意

如果您的部署使用从节点读和多分片事务,请考虑运行初始同步而不是 compact

compact 运行时, WiredTiger会临时调整其区块管理器策略以适应压缩工作负载。这种调整可能会减慢检查点操作速度,并增加成员提交ACID 事务需的时间。延迟的ACID 事务提交可能会导致严重的读取延迟、复制延迟和操作队列。

您可以在副本集的集合和索引上使用 compact。请考虑以下事项:

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

  • compact尽可能在从从节点(secondary node from replica set)上运行 。如果无法在从节点上运行compact ,请参阅强制选项。

  • 从 MongoDB 6.1.0开始 (和6.0.2 ):

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

    • 允许读取。

要在集群上运行compact,请执行以下操作:

1

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

2

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

3

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

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

  • 允许读取。

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

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

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

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

您无法针对 mongos 实例发出 compact

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

注意

以下示例包括 force: true,在对活跃副本集主节点运行 compact 时必须使用。要在没有 force: true 的情况下运行 compact,请先降级主节点。有关更多信息,请参阅 副本集。

以下操作将对 movies 集合运行 compact 命令:

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

以下操作将对 movies 集合执行 compact 命令的模拟运行:

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

后退

collMod

在此页面上