compact
定义
compact
对集合中的所有数据和索引进行重写和碎片整理。在 WiredTiger数据库上,此命令将释放不需要的磁盘空间给操作系统。
语法
该命令具有以下语法:
db.runCommand( { compact: <collection name> } )
命令字段
该命令接受以下字段:
注意
从 MongoDB 4.2 开始
MongoDB 删除了 MMAPv 1存储引擎以及 compact
的 MMAPv 1特定选项paddingFactor
、 paddingBytes
、 preservePadding
。
字段 | 类型 | 说明 |
---|---|---|
compact | 字符串 | 集合的名称。 |
force | 标志 | |
comment | 任何 | 可选。用户提供的待附加到该命令的注释。设置后,该注释将与该命令的记录一起出现在以下位置:
注释可以是任何有效的 BSON 类型(字符串、整型、对象、数组等)。 |
警告
在执行服务器维护(例如compact
操作)之前,始终要有最新的备份。
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" ] } )
行为
阻塞
compact
阻止以下操作:所有其他操作均允许执行。
锁定顺序发生变化。
要在副本集内运行 compact
,请参阅副本集,以了解其他注意事项。
监控进度
要检查 compact
操作的进度,请监控 mongod
日志文件或从另一个 shell 实例运行 db.currentOp()
。
操作终止
如果使用db.killOp()
方法终止操作或在compact
操作完成之前重新启动服务器,请注意以下事项:
磁盘空间
要查看集合的存储空间如何变化,请在压实之前和之后分别运行 collStats
命令。
在WiredTiger 上, compact
尝试减少集合中数据和索引所需的存储空间,从而向操作系统释放不需要的磁盘空间。 此操作的有效性取决于工作负载,并且无法恢复任何磁盘空间。 如果您已从集合中删除大量数据且不打算替换,则此命令非常有用。
compact
可能需要额外的磁盘空间才能在 WiredTiger 数据库上运行。
副本集
您可以在存储在副本集中的集合和索引上使用 compact
,但有一些重要的注意事项:
主节点不会将
compact
命令复制到从节点。尽可能在从节点上运行
compact
。如果无法在从节点上运行compact
,请参阅 force 选项。从 MongoDB 6开始。 0 。 2 (以及5 . 0 . 12 ):
从节点可以在
compact
运行时进行复制。允许读取。
在集群上运行 compact
重新分配主节点。
要降级当前主节点并触发选举,请使用 rs.stepDown()
方法。要指定特定的从节点,请调整节点优先级。
从节点的版本特定注意事项
从节点上的阻塞行为与版本有关。
版本 | 阻止行为 |
4.4 |
|
版本 4.4.17、 5.0.12 和 6.0.2 |
|
运行 compact
命令时,副本集将保持 SECONDARY
状态。
有关副本集成员状态的更多信息,请参阅副本集成员状态。
有关副本集维护和可用性,请参阅在副本集成员上执行维护。