1

我跑了

db.runCommand({"convertToCapped": "all", size: 268435456000})

将当前集合限制为 250GB。SSH 会话超时,但我看到磁盘使用量增加了 250GB。我检查了日志并看到:

Thu Jun 28 23:41:18 [conn312] command logs.$cmd command: { convertToCapped: "all", size: 268435456000.0 } ntoreturn:1 reslen:37 4399826ms
Thu Jun 28 23:41:20 [conn313] end connection 127.0.0.1:53704

什么是 ntoreturn:1?

我再次运行命令。我想它只会看到它已经是 250GB 并且有上限,但它正在填满另外 250GB。我到底在做什么?

4

1 回答 1

2

运行时convertToCapped,MongoDB 会克隆原始集合以创建具有请求大小的新上限集合,然后再删除原始集合。您应该会在 mongod 日志中看到这一点,其序列大致如下:

Fri Jun 29 15:14:49 [FileAllocator] allocating new datafile ./capped.2, filling with zeroes...
Fri Jun 29 15:14:54 [FileAllocator] done allocating datafile ./capped.2, size: 2047MB,  took 4.984 secs
Fri Jun 29 15:14:54 [conn1] command capped.$cmd command: { cloneCollectionAsCapped: "all", toCollection: ".tmp.convertToCapped.all", size: 1536870912.0 } ntoreturn:1 reslen:37 5134ms
Fri Jun 29 15:14:54 [conn1] CMD: drop capped.all
Fri Jun 29 15:14:54 [conn1] command capped.$cmd command: { convertToCapped: "all", size: 1536870912.0 } ntoreturn:1 reslen:37 5135ms
  • 为上限集合预先分配了新数据文件(称为“全部”以匹配您的示例)
  • 现有集合被克隆到临时上限集合
  • 原始集合被丢弃
  • 临时集合重命名为原始集合

因此,如果您有一个 250Gb 的封顶集合并以 250GB 重新运行 convertToCapped,您将暂时使使用的空间增加一倍(原始封顶集合为 250Gb,新封顶集合为 250Gb)。

您可以使用db.repairDatabase()回收额外的空间。

于 2012-06-29T05:19:03.187 回答