我已经通过在shell上运行deleteMany查询删除了集合中的文档,它返回了acknowledgedtrue和result。
即使删除了大约100万个文档,运行show dbs命令时数据库的大小也是一样的。
我在shell上执行的删除查询:
db.getCollection('activity').deleteMany({createdAt:{$lte: 1565375400000}})
上述查询的结果为:
{ "acknowledged" : true, "deletedCount" : 1199713 }
查询前后,show dbs命令的输出为:
admin 0.000GB
local 0.000GB
logDb 17.203GB
为什么数据库大小不会减少,我可以做些什么来释放这个大小?
3条答案
按热度按时间n3h0vuf21#
我将简短地解释:
"为什么会这样"
通过使用db.stats检查数据库()您将意识到mongoDB具有存储大小(数据+未使用空间)和dataSize(数据库中的数据)。如果您从数据库中删除文档,您实际上是在减少dataSize。这是因为mongodb遵循一个存储策略,我可以称之为"尽你所能,什么也不给回"。假设您有15GB的数据,您删除了5GB,MongoDB将继续保留它以前拥有的整个15GB磁盘空间,以便以后可以使用相同的空间存储新数据。
如果你是在一个开发环境我建议转储数据库,删除它,然后恢复它。
1.这是你如何创建一个备份:https://docs.mongodb.com/manual/reference/program/mongodump/
2.通过在mongo shell中执行以下命令删除数据库:
然后单击mongorestore(这是文档链接:https://docs.mongodb.com/manual/reference/program/mongorestore/)
szqfcxe22#
MongoDB不会将空间释放回磁盘,而是考虑到未来的增长而保留空间
运行内务管理的正确方法是删除不需要的集合或删除不需要的DB(确保进行备份),这将释放空间回操作系统
由于您已经删除了文档,我建议您在维护窗口期间运行compact命令(如果是关键环境),这将整理所有数据和索引,并将空间释放回操作系统
https://docs.mongodb.com/manual/reference/command/compact/
谢谢大家!
68bkxrlz3#
从mongodb 3.4.0+版本开始,只需要使用“compact”即可,例如:
db.runCommand({压缩:})
文件如下:https://www.mongodb.com/docs/v3.4/faq/storage/
如何回收WiredTiger中的磁盘空间?WiredTiger存储引擎在删除文档时会维护数据文件中的空记录列表。WiredTiger可以重用这些空间,但除非在非常特殊的情况下,否则不会将其返回给操作系统。
WiredTiger可重用的空闲空间量反映在db.collection.stats()的输出中,标题为wiredTiger.block-manager.file bytes available for reuse。
要允许WiredTiger存储引擎将此空白空间释放给操作系统,您可以对数据文件进行碎片整理。这可以使用compact命令实现。有关其行为和其他注意事项的详细信息,请参阅compact。