定义
兼容性
此命令可用于以下环境中托管的部署:
- 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 } )
命令字段
该命令接受以下字段:
字段 | 类型 | 说明 |
|---|---|---|
| 字符串 | 集合的名称。 |
| 布尔 | 8.0版本新增。: 如果启用, 默认值:False |
| 布尔 | 可选。如启用,则强制 |
| 整型 | 可选。 指定要继续压实操作所必须恢复的最小存储空间量(以兆字节为单位)。 默认值:20 |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
compact 所需权限
对于强制进行身份验证的集群,您必须使用对目标集合执行 compact 特权操作的用户身份进行身份验证。dbAdmin 和 hostManager 角色提供针对非系统集合运行 compact 所需的特权。
对于系统集合,您必须:
创建一个自定义角色,该角色授予对系统集合的
compact操作。将该角色授予新用户或现有用户。
作为该用户进行身份验证,以执行
compact命令。
例如,以下操作创建一个自定义角色,该角色授予针对指定数据库和集合的 compact 操作:
use admin db.createRole( { role: "myCustomCompactRole", privileges: [ { resource: { "db" : "<database>" , "collection" : "<collection>" }, actions: [ "compact" ] } ], roles: [] } )
有关如何配置 resource 文档的详细信息,请参阅有关自管理部署的资源文档。
要将 dbAdmin、hostManager 或自定义角色添加到现有用户,请使用 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 命令试图通过向操作系统释放过时块来减少集合中数据和索引的磁盘空间。效果取决于可释放的块数及其在数据文件中的位置。
要查看集合的存储空间如何变化,请在压实之前和之后运行collStats 命令。您可以使用输出指标collStats.freeStorageSize 来查看可供重复使用的存储量。
该操作是迭代操作,在每次通过中处理数据文件的段。要估算 compact 释放的空间量,请使用 dryRun 标志。对集合调用 compact 会压缩集合及其相关索引。
compact 可能需要额外的磁盘空间才能运行。
备份
压实会定期对数据库设置检查点,这可能会导致同步开销。在高流量数据库上,这可能会产生延迟或阻止备份等操作任务。为避免意外中断,请在进行备份之前禁用压实。
多分片事务
注意
如果您的部署使用从节点读和多分片事务,请考虑运行初始同步而不是 compact。
当 compact 运行时,WiredTiger 会临时调整其块管理器策略以适应紧凑工作负载。调整会减慢检查点操作,并增加节点提交事务所需的时间。事务提交延迟会导致严重的读取延迟、复制延迟和操作队列。
副本集
您可以在副本集中的集合和索引上使用 compact;但是,请考虑以下内容:
主节点不会将
compact命令复制到从节点。尽可能在从节点上运行
compact。如果无法在从节点上运行compact,请参阅 force 选项。从 MongoDB 6.1.0开始 (和6.0.2 ):
从节点可以在
compact运行时进行复制。允许读取。
要在集群上运行 compact:
重新分配主节点。
要降级当前主节点并触发选举,请使用 rs.stepDown() 方法。要指定特定的从节点,请调整节点优先级。
从节点的版本特定注意事项
从节点可以在
compact运行时进行复制。允许读取。
运行 compact 命令时,副本集将保持 SECONDARY 状态。
有关副本集成员状态的更多信息,请参阅副本集成员状态。
有关副本集维护和可用性,请参阅对自管理副本集节点进行维护。
成员之间的索引大小差异
每个节点独立地将写入应用于其索引。即使副本集的成员保存相同的数据,索引存储大小也可能因副本集的成员而异。主节点 (primary node in the replica set)节点直接应用来自客户端操作的写入。节点从节点(secondary node from replica set)以不同的批次和顺序应用来自oplog的相同写入。这些写入模式差异会改变存储引擎打包和压缩索引页的方式。因此,一个成员上的索引在磁盘上的增长可能大于另一个成员上的相同索引。
要使受影响的索引与其他节点上的相同索引重新保持一致,请使用以下修复选项之一:
在受影响的节点上运行
compact。
在规划副本集的存储容量时,请考虑节点之间索引大小的这种差异。
分片集群
compact 只适用于mongod实例。在分片环境中,在每个分片上分别运行 compact 作为维护操作。
您无法针对 mongos 实例发出 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 }