On this page
compact
在本页面
Definition
compact
- 重写集合中的所有数据和索引并对其进行碎片整理。在WiredTiger数据库上,此命令将不必要的磁盘空间释放给 os。
compact的格式如下:
{ compact: <collection name> }
compact接受以下字段:
Field | Type | Description |
---|---|---|
compact |
string | 集合的名称。 |
force |
boolean | 可选的。如果是true ,则compact可以在replica set中的primary上运行。如果false ,则compact在主数据库上运行时返回错误,因为该命令将阻止所有其他操作。 |
compact仅阻止正在压缩的数据库的操作。
| paddingFactor
|数字|可选。 *仅适用于 MMAPv1 存储引擎.*指定在compact操作期间使用的填充(作为文档大小的因数)。
compact完成后,paddingFactor
不会影响后续记录分配的填充。有关更多信息,请参见paddingFactor。
| paddingBytes
|整数|可选。 *仅适用于 MMAPv1 存储引擎.*指定在compact操作期间要使用的填充(以绝对字节数为单位)。
compact完成后,paddingBytes
不会影响后续记录分配的填充。有关更多信息,请参见paddingBytes。
| preservePadding
|布尔值|可选。 *仅适用于 MMAPv1 存储引擎.*指定compact进程应保持文档padding完好无损。
此选项不能与paddingFactor
或paddingBytes
一起使用。
2.6 版中的新功能。
Warning
在执行服务器维护(例如compact操作)之前,请始终进行最新备份。
paddingFactor
Note
仅适用于 MMAPv1 存储引擎;与 WiredTiger 存储引擎一起使用时,指定paddingFactor
无效。
paddingFactor
字段采用以下值范围:
默认值:
1.0
最少:
1.0
(无填充)上限:
4.0
如果您的更新增加了文档的大小,则填充将增加分配给每个文档的空间量,并避免在数据文件中进行昂贵的文档重定位操作。
您可以通过从记录大小中减去文档大小,或者以paddingFactor
表示,从paddingFactor
减去1
来计算填充大小:
padding size = (paddingFactor - 1) * <document size>.
例如,1.0
的paddingFactor
指定0
的填充大小,而1.2
的paddingFactor
指定0.2
的填充大小或文档大小的 20%(20%)。
使用以下命令,您可以使用compact命令的paddingFactor
选项将记录大小设置为文档大小的1.1
,或者将填充因子设置为 10%(10%):
db.runCommand ( { compact: '<collection>', paddingFactor: 1.1 } )
compact修改现有文档,但未设置将来文档的填充因子。
paddingBytes
Note
仅适用于 MMAPv1 存储引擎;与 WiredTiger 存储引擎一起使用时,指定paddingBytes
无效。
如果您的文档开始时很小,但随后又大幅增加,则指定paddingBytes
会很有用。
例如,如果您的文档最初是 40 字节长,并且您将它们增加了 1 kB,则使用paddingBytes: 1024
可能是合理的,因为使用paddingFactor: 4.0
将指定 160 字节的记录大小(4.0
乘以初始文档大小),这只会提供填充 120 字节(即记录大小 160 字节减去文档大小)。
以下命令使用paddingBytes
选项将<collection>
命名的集合的填充大小设置为 100 字节:
db.runCommand ( { compact: '<collection>', paddingBytes: 100 } )
紧凑型必需特权
对于执行authentication的集群,您必须使用对目标集合具有compact特权操作的用户身份进行身份验证。 dbAdmin角色提供针对非系统集合运行compact所需的特权。
对于system collections,创建一个自定义角色以授予对系统集合compact的操作。然后,您可以将该角色授予新用户或现有用户,并以该用户身份进行身份验证以执行compact命令。例如,以下操作创建一个自定义角色,该角色将对指定的数据库和集合授予compact操作:
use admin
db.createRole(
{
role: "myCustomCompactRole",
privileges: [
{
resource: { "db" : "<database>" , "collection" : "<collection>" },
actions: [ "compact" ]
}
],
roles: []
}
)
有关配置resource
文档的更多信息,请参见Resource Document。
要将dbAdmin或自定义角色添加到现有用户,请使用db.grantRoleToUser
或db.updateUser()。以下操作将自定义compact
角色授予admin
数据库上的myCompactUser
:
use admin
db.grantRoleToUser("myCompactUser", [ "dbAdmin" | "myCustomCompactRole" ] )
要将dbAdmin或自定义角色添加到新用户,请在创建用户时为db.createUser()方法的roles
数组指定角色。
use admin
db.createUser(
{
user: "myCompactUser",
pwd: "myCompactUserPassword"
roles: [
{ role: "dbAdmin", db: "<database>" } | "myCustomCompactRole"
]
}
)
Behavior
Blocking
compact仅阻止对其当前正在运行的数据库的操作。仅在计划的维护期间使用compact。
您可以通过查看mongod日志文件或在另一个 Shell 实例中运行db.currentOp()来查看中间进度。
Operation Termination
如果您使用db.killOp()方法终止操作或在compact操作完成之前重新启动服务器,请注意以下几点:
如果启用了日记功能,则无论compact操作的状态如何,数据都将保持有效和可用。您可能必须手动重建索引。
无论哪种情况,集合中许多现有的可用空间都可能变得不可重用。在这种情况下,您应该重新运行压缩以完成操作,以恢复对该可用空间的使用。
Disk Space
compact对可用磁盘空间的影响取决于所使用的存储引擎。
要查看集合的存储空间如何变化,请在压缩之前和之后运行collStats命令。
WiredTiger
在WiredTiger上,compact尝试减少集合中数据和索引所需的存储空间,从而将不必要的磁盘空间释放给 os。此操作的有效性取决于工作负载,并且无法恢复任何磁盘空间。如果您已从集合中删除了大量数据并且不打算替换它,则此命令很有用。
compact可能需要更多磁盘空间才能在 WiredTiger 数据库上运行。
MMAPv1
在MMAPv1,compact上对集合的数据文件进行碎片整理并重新创建其索引。未使用的磁盘空间不会释放到系统中,而是保留以供将来使用。如果您希望从 MMAPv1 数据库中回收磁盘空间,则应执行initial sync。
compact最多需要 2 GB 的额外磁盘空间才能在 MMAPv1 数据库上运行。
Note
compact可能会增加数据文件的总大小和数量,尤其是在首次运行时。但是,这不会增加集合的总存储空间,因为存储大小是数据库文件内分配的数据量,而不是文件系统上文件的大小/数量。
Replica Sets
compact命令不会复制到replica set中的辅助命令。
分别压缩每个成员。
理想情况下,在辅助服务器上运行compact。有关压缩主数据库的信息,请参见上面的选项
force:true
。在辅助节点上,compact命令强制辅助节点进入RECOVERING状态。向处于RECOVERING状态的实例发出的读取操作将失败。这样可以防止 Client 端在操作过程中阅读。操作完成后,辅助节点将返回SECONDARY状态。
有关副本集成员状态的更多信息,请参见副本集成员国。
请参见对副本集成员执行维护以获取示例副本集维护过程,以在维护操作期间最大化可用性。
Sharded Clusters
compact仅适用于mongod个实例。在分片环境中,对每个分片分别运行compact作为维护操作。
Capped Collections
在MMAPv1上,无法压缩capped collections。
在WiredTiger上,compact命令将尝试压缩集合。
Index Building
2.6 版的新功能。