如果删除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
答案 0 :(得分:71)
TL; DR:您有两种选择。将MongoDB启动到limit the size of the journal files到128MB时使用--smallfiles
启动选项,或使用--nojournal
选项关闭日记功能。在生产中使用--nojournal
通常是一个坏主意,并且在开发中使用不同的写入问题通常也是有意义的,因此您在dev和prod中没有不同的代码。
答案很长: 不,删除日志文件并不安全。日记的想法是这样的:
写入了。现在,为了使写入持久化(并且数据库持久),写入必须以某种方式进入磁盘。
不幸的是,写入磁盘只需要compared to writes to the RAM,因此数据库处于两难境地:不写入磁盘是有风险的,因为意外关闭会导致数据丢失。但是,为每次写入操作写入磁盘都会降低数据库的性能,使其无法用于实际目的。
现在不是写入数据文件本身,而是为每个请求执行此操作,数据库将简单地附加到日志文件,其中它存储尚未提交到实际数据文件的所有操作。这要快得多,因为文件已经“热”,因为它一直在读取和写入,并且它只是一个文件,而不是一堆文件,最后,因为它每100ms批量写入所有待处理的操作默认情况下。在某些事情中删除此文件会造成严重破坏。
答案 1 :(得分:70)
正如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 config style一起使用,请使用相同的步骤备份配置,如上所述,但进入
mmapv1:
配置块,插入
smallFiles: true
。然后,按照上述步骤重新启动服务器,同时删除日记帐。
在开发机器上,默认情况下,WiredTiger下的日志文件应该比MMAPv1下小一些,因为journal compression是默认启用的。根据{{3}}," MongoDB的WiredTiger日志文件的最大大小限制大约为100 MB"。它将以60秒或2千兆字节的日志数据创建检查点(即将快照数据写入磁盘)。"
因此,如果您只在数据库上运行少量请求(几乎没有数据要更改),则使用WiredTiger的日志文件不应超过100 MB的低倍数。但是,日志文件的大小似乎不可配置。
答案 2 :(得分:9)
defmodule Mix.Tasks.SendEmails.Reminder do
use Mix.Task
import Mix.Ecto
import Ecto.Query
def run(_args) do
Mix.Tasks.App.Start.run([]) # This will start all apps
Foobar.welcome_email |> MyApp.Mailer.deliver_now
end
end
自此发展起来。现在是v3.4.1 stable
我在v3.2这里是如何:
取消注释mongodb
所以它看起来像:
# mmapv1:
如果您在 mmapv1:
smallFiles: true
页面上找到storage Options
的其他版本。
不要忘记清空reference/configuration-options
journal