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. 如果启用,则 默认值: False |
force | boolean | 已更改版本4.4. 可选。如果启用,强制 |
freeSpaceTargetMB | Integer | 可选。指定必须可恢复的最小存储空间量(以兆字节为单位),以便压缩操作可以继续。 默认 20 |
注释 | 任何 | 可选。用户提供的注释,用于附加到此命令。一旦设置,此注释将出现在以下位置的此命令记录旁边:
注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。 |
compact
所需权限
对于强制执行身份验证的集群,您必须以具有在目标集合上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()
。以下操作将自定义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
重新分配主节点。
要降级当前主节点并触发选举,请使用 rs.stepDown()
方法。要指定特定的从节点,请调整成员优先级。
二级节点版本特定注意事项
当运行
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 }