compact
定义
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
db.runCommand( { compact: <string>, dryRun: <boolean>, force: <boolean>, // Optional freeSpaceTargetMB: <int>, // Optional comment: <any>, // Optional } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
---|---|---|
| 字符串 | 集合的名称。 |
| 布尔 | 8.0版本新增。 如果启用, 默认: False |
| 布尔 | Changed in version 4.4. Optional. If enabled, forces |
| 整型 | 可选。 指定要继续压实操作所必须恢复的最小存储空间量(以兆字节为单位)。 默认: 20 |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
compact
所需权限
For clusters enforcing 身份验证,
you must authenticate as a user with the compact
privilege
action on the target collection. The dbAdmin
and
hostManager
roles provide the required privileges for running
compact
against non-system collections.
对于系统集合,您必须:
创建一个自定义角色,该角色授予对系统集合的
compact
操作。将该角色授予新用户或现有用户。
作为该用户进行身份验证,以执行
compact
命令。
例如,以下操作创建一个自定义角色,该角色授予针对指定数据库和集合的 compact
操作:
use admin db.createRole( { role: "myCustomCompactRole", privileges: [ { resource: { "db" : "<database>" , "collection" : "<collection>" }, actions: [ "compact" ] } ], roles: [] } )
有关如何配置 resource
文档的详细信息,请参阅有关自管理部署的资源文档。
To add the dbAdmin
, hostManager
, or the custom role to
an existing user, use db.grantRolesToUser()
or db.updateUser()
.
The following operation grants the custom compact
role to the
myCompactUser
on the admin
database:
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.1.0 开始。(以及 6.0.2 和 5.0.12):
从节点可以在
compact
运行时进行复制。允许读取。
在集群上运行 compact
重新分配主节点。
要降级当前主节点并触发选举,请使用 rs.stepDown()
方法。要指定特定的从节点,请调整节点优先级。
从节点的版本特定注意事项
从节点可以在
compact
运行时进行复制。允许读取。
运行 compact
命令时,副本集将保持 SECONDARY
状态。
有关副本集成员状态的更多信息,请参阅副本集成员状态。
有关副本集维护和可用性,请参阅对自管理副本集节点进行维护。
分片集群
compact
仅适用于 mongod
实例。在分片环境中,在每个分片上分别运行 compact
作为维护操作。
您无法针对 mongos
实例发出
compact
。
索引构建
mongod
在执行 compact
操作后并行重建所有索引。
不允许并发压缩命令
If you try to run multiple concurrent compact
commands on the same
collection, MongoDB returns an error.
例子
Compact a Collection
以下操作将对 movies
集合运行 compact
命令:
db.runCommand( { compact: "movies" } )
{ bytesFreed: 27859, ok: 1 }
Estimate Compaction
The following operation performs a dry run of the compact
command on the
movies
collection:
db.runCommand( { compact: "movies", dryRun: true } )
{ estimatedBytesFreed: 27859, ok: 1 }