删除mongodb的日志文件是否安全?

如果我删除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 

TL; DR:你有两个select。 启动MongoDB时使用--smallfiles启动选项,将日志文件的大小限制为128MB,或使用--nojournal选项closures日志。 在生产中使用--nojournal通常是一个糟糕的主意,在开发中使用不同的写入问题通常也是有意义的,所以在dev和prod中没有不同的代码。

长答案 :不,删除日志文件是不安全的。 日记的想法是这样的:

写入进来。现在,要使写入持久化(和数据库持久),写入必须以某种方式到磁盘。

不幸的是, 与写入RAM相比,写入磁盘需要花费很多时间,所以数据库处于两难境地:不写入磁盘是有风险的,因为意外的closures会导致数据丢失。 但是,对于每一次写入操作而言,写入磁盘将会严重降低数据库的性能,使其在实际应用中变得不可用。

现在,不是写入数据文件本身,而是对每个请求执行该操作,数据库将简单地附加到日志文件,在该日志文件中存储所有尚未提交到实际数据文件的操作。 这个速度要快得多,因为文件已经是“热”了,因为它一直被读取和写入,只有一个文件,而不是一堆文件,最后,因为它每隔100ms就会写一个批处理操作默认。 在中间删除这个文件会造成严重破坏。

正如mnemosyn的回答所解释的,日志对于存储引擎是至关重要的。 幸运的是,它可以在一定程度上控制。 以下内容是为MMAPv1存储引擎编写的,这是MongoDB 3.2之前的默认值。 然后, WiredTiger成为select的引擎,更多的信息可以在这个答案的底部find。

MMAPv1

MongoDB <2.6(非YAMLconfiguration)

对于我们的开发服务器,我们使用了以下过程:

 cp -p /etc/mongodb.conf /etc/mongodb.conf.orig vi /etc/mongodb.conf 

现在,插入

 smallfiles=true 

进入mongodb.conf,然后保存。 文件将日志文件限制为128MB。

 service mongodb stop rm -rf /var/lib/mongodb/journal/* service mongodb start 

MongoDB> = 2.6(YAMLconfiguration)

如果您使用YAMLconfiguration样式的 MMAPv1,请使用相同的步骤备份上述的configuration,但进入

  mmapv1: 

configuration块,插入

  smallFiles: true 

。 之后,按照上述步骤重新启动服务器,同时移除日志。

WiredTiger(MongoDB> = 3.0,自3.2开始)

在开发机器上,WiredTiger下的日志文件应该比MMAPv1中的默认值稍小一些,因为日志压缩默认是启用的。 根据文档 ,“MongoDB的WiredTiger日志文件的最大大小限制约为100 MB”。 它将“以60秒或2千兆字节的日志数据为间隔创build检查点(即将快照数据写入磁盘)”。

因此,如果您只在数据库上运行less量请求(只需很less的数据可以更改),则使用WiredTiger的日志文件不应超过100 MB的低倍数。 日志文件的大小似乎不可configuration,但是。

mongodb从此演变而来。 现在它的v3.4.1稳定 。
我在v3.2这里是如何:
取消注释# mmapv1:所以它看起来像:

  mmapv1: smallFiles: true 

如果在reference/configuration-options页面上有不同的版本,则查找storage Options

不要忘记清空journal

 sudo service mongodb stop sudo rm -rf /var/lib/mongodb/journal/* sudo service mongodb start