MongoDB数据库在长期频繁地删除/写入数据或批量删除了大量数据,将产生很多物理空间碎片。这些碎片将占用磁盘空间,降低磁盘利用率。您可以对集合中的所有数据和索引进行重写和碎片整理,释放未使用的空间,提升磁盘利用率和查询性能。
预估回收的物理空间
- 通过mongo shell连接MongoDB实例,详情请参见:
- Mongo Shell连接单节点实例
- Mongo Shell连接副本集实例
- Mongo Shell连接分片集群实例
- 切换至集合所在的数据库。
use <database_name>
说明 <database_name>:数据库名。
- 执行下列命令查询。
db.<collection_name>.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
说明 <collection_name>:集合名。
查询示例:
db.customer.stats().wiredTiger["block-manager"]["file bytes available for reuse"]
执行结果示例:
207806464
整理单节点实例/副本集实例的碎片
- 通过mongo shell连接MongoDB实例的Primary节点,详情请参见mongoshell连接实例。
- 切换至集合所在的数据库。
use <database_name>
说明 <database_name>:数据库名。
- 执行
db.stats()
命令查看碎片整理前数据库占用的磁盘空间。
- 执行以下命令,对某个集合进行碎片整理。
db.runCommand({compact:"<collection_name>",force:true})
说明
- <collection_name>:集合名。
force
为可选项,如您需要在副本集实例的Primary节点执行该命令,需要设置force
的值为true。
- 等待执行,返回
{ "ok" : 1 }
代表执行完成。
说明 compact操作不会传递给Secondary节点,当实例为副本集实例时,请重复上述步骤通过mongo shell连接至Secondary节点,执行碎片整理命令。
碎片整理完毕后,可通过db.stats()
命令查看碎片整理后数据库占用的磁盘空间。本案例碎片整理前后的对比如下图所示。


整理分片集群实例的碎片
- 通过mongo shell连接分片集群实例中的任一mongos节点,详情请参见mongo shell连接分片集群实例。
- 执行
db.stats()
命令查看碎片整理前数据库占用的磁盘空间。
- 执行以下命令,对Shard节点中的Primary节点进行集合的碎片整理。
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>",force:true}})
说明
- <Shard ID>:Shard节点ID。
- <collection_name>:集合名。
- 执行以下命令,对Shard节点中的Secondary节点进行集合的碎片整理。
db.runCommand({runCommandOnShard:"<Shard ID>","command":{compact:"<collection_name>"},queryOptions: {$readPreference: {mode: 'secondary'}}})
说明
- <Shard ID>:Shard节点ID。
- <collection_name>:集合名。
碎片整理完毕后,可通过db.runCommand({dbstats:1})
命令查看碎片整理后数据库占用的磁盘空间。
相关问题
解决因磁盘空间耗尽导致的锁定/无法写入问题
原创文章,作者:网友投稿,如若转载,请注明出处:https://www.cloudads.cn/archives/33806.html