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 }