mongodb 从数据库中删除单据后,存储空间没有减少,为什么?

v6ylcynt  于 2023-03-01  发布在  Go
关注(0)|答案(3)|浏览(650)

我已经通过在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

为什么数据库大小不会减少,我可以做些什么来释放这个大小?

n3h0vuf2

n3h0vuf21#

我将简短地解释:
"为什么会这样"
通过使用db.stats检查数据库()您将意识到mongoDB具有存储大小(数据+未使用空间)和dataSize(数据库中的数据)。如果您从数据库中删除文档,您实际上是在减少dataSize。这是因为mongodb遵循一个存储策略,我可以称之为"尽你所能,什么也不给回"。假设您有15GB的数据,您删除了5GB,MongoDB将继续保留它以前拥有的整个15GB磁盘空间,以便以后可以使用相同的空间存储新数据。

    • 如何释放存储**

如果你是在一个开发环境我建议转储数据库,删除它,然后恢复它。
1.这是你如何创建一个备份:https://docs.mongodb.com/manual/reference/program/mongodump/
2.通过在mongo shell中执行以下命令删除数据库:

db.dropDatabase()

然后单击mongorestore(这是文档链接:https://docs.mongodb.com/manual/reference/program/mongorestore/

szqfcxe2

szqfcxe22#

MongoDB不会将空间释放回磁盘,而是考虑到未来的增长而保留空间
运行内务管理的正确方法是删除不需要的集合或删除不需要的DB(确保进行备份),这将释放空间回操作系统
由于您已经删除了文档,我建议您在维护窗口期间运行compact命令(如果是关键环境),这将整理所有数据和索引,并将空间释放回操作系统
https://docs.mongodb.com/manual/reference/command/compact/
谢谢大家!

68bkxrlz

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。

相关问题