compact

在本页面

Definition

  • compact
    • 重写集合中的所有数据和索引并对其进行碎片整理。在WiredTiger数据库上,此命令将不必要的磁盘空间释放给 os。

compact的格式如下:

{ compact: <collection name> }

compact接受以下字段:

FieldTypeDescription
compactstring集合的名称。
forceboolean可选的。如果是true,则compact可以在replica set中的primary上运行。如果false,则compact在主数据库上运行时返回错误,因为该命令将阻止所有其他操作。


compact仅阻止正在压缩的数据库的操作。
| paddingFactor |数字|可选。 *仅适用于 MMAPv1 存储引擎.*指定在compact操作期间使用的填充(作为文档大小的因数)。
compact完成后,paddingFactor不会影响后续记录分配的填充。有关更多信息,请参见paddingFactor
| paddingBytes |整数|可选。 *仅适用于 MMAPv1 存储引擎.*指定在compact操作期间要使用的填充(以绝对字节数为单位)。
compact完成后,paddingBytes不会影响后续记录分配的填充。有关更多信息,请参见paddingBytes
| preservePadding |布尔值|可选。 *仅适用于 MMAPv1 存储引擎.*指定compact进程应保持文档padding完好无损。
此选项不能与paddingFactorpaddingBytes一起使用。
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.0paddingFactor指定0的填充大小,而1.2paddingFactor指定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.grantRoleToUserdb.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操作的状态如何,数据都将保持有效和可用。您可能必须手动重建索引。

  • 如果未启用日记功能,并且在操作期间mongodcompact终止,则无法保证数据处于有效状态。

  • 无论哪种情况,集合中许多现有的可用空间都可能变得不可重用。在这种情况下,您应该重新运行压缩以完成操作,以恢复对该可用空间的使用。

Disk Space

compact对可用磁盘空间的影响取决于所使用的存储引擎。

要查看集合的存储空间如何变化,请在压缩之前和之后运行collStats命令。

WiredTiger

WiredTiger上,compact尝试减少集合中数据和索引所需的存储空间,从而将不必要的磁盘空间释放给 os。此操作的有效性取决于工作负载,并且无法恢复任何磁盘空间。如果您已从集合中删除了大量数据并且不打算替换它,则此命令很有用。

compact可能需要更多磁盘空间才能在 WiredTiger 数据库上运行。

MMAPv1

MMAPv1compact上对集合的数据文件进行碎片整理并重新创建其索引。未使用的磁盘空间不会释放到系统中,而是保留以供将来使用。如果您希望从 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作为维护操作。

您不能针对mongos实例发出compact

Capped Collections

MMAPv1上,无法压缩capped collections

WiredTiger上,compact命令将尝试压缩集合。

Index Building

2.6 版的新功能。

mongodcompact操作之后并行重建所有索引。