使用版本为mongodb-win32-x86_64-3.2.1,用的默认的WiredTiger存储引擎。
一个collection中有大约400万文档,占用40G空间;后来遍历删除每个文档处理中无用的部分并更新(未删除文档),执行此任务的脚本如期运行完成,根据其输出统计,文档整体缩减到原来45%左右,也就是有20G多些的空间被腾出来了,但数据库文件体积没有变小,反而增大了一点点(1%左右)。
看了文档中关于存储的章节,https://docs.mongodb.com/v3.2...,其中提到删除文档导致的空记录占用空间可通过compact回收(使用WiredTiger存储引擎时),没提到前述这种修改文档形成的“虚占空间”的情形,我运行了compact,几秒钟就结束了,存储文件没有变小。那么该怎么办呢?
> use cache
switched to db cache
> db.htmldocs.runCommand("compact")
{ "ok" : 1 }
> db.runCommand({compact: "htmldocs"})
{ "ok" : 1 }
ringa_lee2017-05-02 09:26:24
예, WT가 최신 버전을 사용하면 compact
실제로 공간을 확보할 수 있지만 버그로 인해 특정 버전 3.2 이후부터 적용되어야 합니다. 구체적인 버전 번호(3.2.9? ) 그러나 3.2.1이 확실히 유효하지 않다는 것은 확실하며 최신 버전인 3.2.12로 업그레이드하면 이 문제가 확실히 해결됩니다.
repairDatabase
에 비하면 compact
는 확실히 가벼워 보이지만, 그래도 무거운 작업이라는 게 피할 수 없는 문제다. Windows에서 디스크 조각 모음을 상상해 보세요. 원리는 동일합니다. 더 권장되지만 덜 영향을 미치는 접근 방식은 복제본 세트를 사용하여 모든 노드를 순차적으로 다시 초기화하고 공간을 해제하는 것입니다.
더 중요한 질문은 이 공간을 되찾는 것이 실제로 당신에게 의미가 있느냐는 것입니다. 대부분의 경우 시스템이 이러한 공간을 점유했다는 사실은 시스템 설계가 변경되지 않는 한 이러한 공간을 다시 점유할 가능성이 있음을 의미합니다. 이를 해제하고 나중에 재할당하는 것보다 그대로 유지하면 시스템이 이를 재사용하는 것이 더 좋습니다.
伊谢尔伦2017-05-02 09:26:24
다음은 제가 이해한 내용입니다.
1. 단일 컬렉션의 압축은 파일 시스템의 저장 공간을 회수하지 않으며, 전체 데이터베이스의 db.repairDatabase()만 파일 시스템의 저장 공간을 회수할 수 있습니다. RepirDatabase()를 사용해 보십시오.
2. 내보내기/가져오기 수집 방법을 사용할 수도 있습니다
위 작업이 시스템 성능에 미치는 영향에 유의하세요. 참고로.
요즘 휴가를 다녀왔는데, 미리 행복한 설 연휴 보내시기 바랍니다.
MongoDB를 사랑해주세요!