如果删除3.1G日志文件,sudo service mongodb restart
将失败。但是,此文件占用太多空间。我怎么解决这个问题?如何删除?
bash$ du -sh /var/lib/mongodb/*
4.0K _tmp
65M auction_development.0
128M auction_development.1
17M auction_development.ns
3.1G journal
4.0K mongod.lock
Answers:
TL; DR:您有两个选择。--smallfiles
启动MongoDB时,请使用启动选项将日记文件的大小限制为128MB,或使用该--nojournal
选项关闭日记功能。--nojournal
在生产中使用通常是一个坏主意,在开发中也使用不同的写关注点通常很有意义,因此您在开发和生产中没有不同的代码。
长答案:不,删除日志文件是不安全的。日记的想法是这样的:
进入写入操作。现在,要使该写入操作具有持久性(并使数据库具有持久性),则必须以某种方式将写入操作转到磁盘。
不幸的是,与对RAM的写入相比,对磁盘的写入要困难得多,因此数据库处于两难境地:不写入磁盘是有风险的,因为意外关闭会导致数据丢失。但是,每执行一次写入操作就将磁盘写入磁盘会严重降低数据库的性能,以至于无法用于实际目的。
现在,数据库不再写数据文件本身,也不是针对每个请求都写数据文件,而是简单地追加到日记文件中,在日记文件中存储尚未提交给实际数据文件的所有操作。这要快得多,因为文件一直被读写,因此它已经很“热”了,它只是一个文件,而不是一堆文件,最后,因为它每隔100ms一次写入所有待处理的操作默认。在某些情况下删除此文件会造成严重破坏。
smallfiles
在(Mitjas答案)[ stackoverflow.com/a/25516871/1318694]中添加了该选项并且在删除之前干净地停止了数据库时。如果每次启动数据库都丢失,将重新创建日志文件。该smallfiles
选项更改这些文件的大小。
正如mnemosyn的回答所解释的那样,日记对于存储引擎至关重要。幸运的是,可以在一定程度上控制它。以下内容是针对MMAPv1存储引擎编写的,它是MongoDB 3.2之前的默认设置。然后,WiredTiger成为了首选引擎,可以在此答案的底部找到更多信息。
对于我们的开发服务器,我们使用以下过程:
cp -p /etc/mongodb.conf /etc/mongodb.conf.orig
vi /etc/mongodb.conf
现在,插入
smallfiles=true
进入mongodb.conf,然后保存。smallfiles将日记文件限制为128MB。
service mongodb stop
rm -rf /var/lib/mongodb/journal/*
service mongodb start
如果您将MMAPv1与YAML配置样式一起使用,请使用与上述相同的步骤来备份配置,但是
mmapv1:
配置块,插入
smallFiles: true
。然后,按照上述步骤操作,在删除日志的同时重新启动服务器。
在开发机器上,默认情况下WiredTiger下的日记文件应比MMAPv1下小一些,因为默认情况下启用了日记压缩。根据文档,“ MongoDB的WiredTiger日志文件的最大大小限制为大约100 MB”。它将“以60秒或2 GB的日志数据间隔创建检查点(即,将快照数据写入磁盘)”。
因此,如果您仅在数据库上运行少量请求(几乎没有要更改的数据),则使用WiredTiger的日记文件不应超过100 MB的低倍。但是,日志文件的大小似乎不可配置。