定义
compact对集合中的所有数据和索引进行重写和碎片整理。 在 WiredTiger数据库上,此命令将发布不需要的磁盘空间给操作系统。
兼容性
此命令可用于以下环境中托管的部署:
MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务
重要
M 0 、M 2和 M 5集群不支持此命令。 有关更多信息,请参阅不支持的命令。
MongoDB Enterprise:基于订阅、自我管理的 MongoDB 版本
MongoDB Community:源代码可用、免费使用且可自行管理的 MongoDB 版本
语法
该命令具有以下语法:
{ compact: <collection name> }
命令字段
该命令接受以下字段:
注意
从 MongoDB 4.2 开始
MongoDB删除了 MMAPv1storage engine 以及 的 MMAPv1 特定选项paddingFactor 、 、{4paddingBytes preservePaddingcompact}。
字段 | 类型 | 说明 |
|---|---|---|
| 字符串 | 集合的名称。 |
| flag | 可选。 从 v4.4 开始,如果指定,将强制 从 v4.4 开始, |
| any | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 4.4 版本新增。 |
compact 所需权限
对于强制执行身份验证的集群,您必须以对目标集合具有compact操作权限的用户身份进行身份验证。 dbAdmin角色提供对非系统集合运行compact所需的特权。
有关如何配置 resource 文档的详细信息,请参阅有关自管理部署的资源文档。
要将 dbAdmin 或自定义角色添加到现有用户,请使用 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" ] } )
行为
阻塞
阻止行为与版本有关。
版本 | 阻止行为 |
4.4 | |
发布4.4.17和5.0.12 |
要在副本集内运行 compact,请参阅副本集,以了解其他注意事项。
监控进度
要检查 compact 操作的进度,请监控 mongod 日志文件或从另一个 shell 实例运行 db.currentOp()。
操作终止
如果使用 db.killOp() 方法终止 compact,或在操作完成之前重新启动服务器,则 compact 将结束,并且可能无法尝试将磁盘空间释放回操作系统。
磁盘空间
要查看集合的存储空间如何变化,请在压实之前和之后分别运行 collStats 命令。
在WiredTiger 上, compact尝试减少集合中数据和索引所需的存储空间,从而向操作系统释放不需要的磁盘空间。 此操作的有效性取决于工作负载,并且无法恢复任何磁盘空间。 如果您已从集合中删除大量数据且不打算替换,则此命令非常有用。
compact 可能需要额外的磁盘空间才能在 WiredTiger 数据库上运行。
副本集
您可以在存储在副本集中的集合和索引上使用 compact,但有一些重要的注意事项:
主节点不会将
compact命令复制到从节点。尽可能在从节点上运行
compact。如果无法在从节点上运行compact,请参阅 force 选项。从 MongoDB 5.0.12 开始:
从节点可以在
compact运行时进行复制。允许读取。
在集群上运行 compact
重新分配主节点。
要降级当前主节点并触发选举,请使用 rs.stepDown() 方法。要指定特定的从节点,请调整节点优先级。
从节点的版本特定注意事项
从节点上的阻塞行为与版本有关。
版本 | 阻止行为 |
4.4 |
|
发布4.4.17和5.0.12 |
|
运行 compact 命令时,副本集将保持 SECONDARY 状态。
有关副本集成员状态的更多信息,请参阅副本集成员状态。
有关副本集维护和可用性,请参阅对自管理副本集节点进行维护。