云数据库MongoDB版释放磁盘空间

本文介绍云数据库MongoDB版释放磁盘空间的方法。

背景信息

MongoDB3.2版本开始,使用WiredTiger作为默认的存储引擎。云数据库MongoDB数据都配置了storage.directoryPerDB:true 参数,于是每个数据库以独立文件夹的形式存储在磁盘上,而数据集合都是对应数据库文件夹下独立的文件。storage.directoryPerDB:true 参数的更多信息,请参见storage.directoryPerDB

操作步骤

1.检查是否存在废弃的索引、集合或者数据库,然后使用dropIndexesdropdropDatabase命令删除对应的索引、集合或者数据,该类命令执行后,会立即将对应的文件删除,从而达到释放磁盘空间的目的。

2.检查是否存在不需要的文档,然后使用delete命令,删除对应的文档。和MySQL类似,MongoDB的文档删除也可以看作是标记删除,只是将对应的一小块存储空间标记为空闲,等待被重用,因此删除文档命令,不能立即释放磁盘空间,如果想要立即释放这部分空闲空间,请查看步骤3。

3.检查集合是否存在大量的空闲空间,通过collStats命令,比较StorageSizefreeStorageSize这两个字段,然后使用compact命令回收空闲的物理空间,具体操作请参见回收磁盘碎片以提升磁盘利用率

说明
  • compact命令,需要在每个节点上分别执行。

  • MongoDB 4.4之前的版本,执行compact命令时,会阻塞其他所有的操作,请谨慎操作。

  • 使用cursor.forEach命令,将文档全部复制到新的集合,然后重命名的方法也能达到释放磁盘空间的目的。该方法仅适用于离线场景。