71

如果我删除3.1G的journal文件,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
4

3 回答 3

75

TL;DR:你有两个选择。启动 MongoDB 时使用--smallfiles启动选项将日志文件的大小限制--nojournal为 128MB,或使用该选项关闭日志。在生产中使用--nojournal通常是一个坏主意,并且在开发中使用不同的写入关注点通常是有意义的,因此您在 dev 和 prod 中没有不同的代码。

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

写入。现在,为了使写入持久化(并使数据库持久化),写入必须以某种方式进入磁盘。

不幸的是,与写入 RAM 相比,写入磁盘需要 eons ,因此数据库处于两难境地:不写入磁盘是有风险的,因为意外关闭会导致数据丢失。但是,每次写入操作都写入磁盘会严重降低数据库的性能,以至于无法用于实际目的。

现在,数据库不再写入数据文件本身,也不再为每个请求执行此操作,而是简单地附加到日志文件中,其中存储了尚未提交到实际数据文件的所有操作。这要快得多,因为文件已经“热”了,因为它一直在被读写,而且它只是一个文件,而不是一堆文件,最后,因为它每 100 毫秒批量写入所有挂起的操作默认。在某些事情中间删除此文件会造成严重破坏。

于 2013-10-23T07:29:53.483 回答
75

正如 mnemosyn 的回答中所解释的,日志对于存储引擎来说是必不可少的。幸运的是,它可以在一定程度上得到控制。以下是为MMAPv1存储引擎编写的,这是 MongoDB 3.2 之前的默认设置。然后,WiredTiger成为首选引擎,可以在此答案的底部找到更多信息。

MMAPv1

MongoDB < 2.6(非 YAML 配置)

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

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

MongoDB >= 2.6(YAML 配置)

如果您使用带有YAML 配置样式的 MMAPv1 ,请使用与上述相同的步骤来备份配置,但要备份到

  mmapv1:

配置块,插入

    smallFiles: true 

. 之后,按照上述方式进行操作,在删除日志的同时重新启动服务器。

WiredTiger (MongoDB >=3.0, 默认自 3.2)

在开发机器上,默认情况下,WiredTiger 下的日志文件应该比 MMAPv1 下的日志文件小一些,因为默认情况下启用了日志压缩。根据文档,“MongoDB 的 WiredTiger 日志文件的最大大小限制约为 100 MB”。它将“每隔 60 秒或 2 GB 的日志数据创建检查点(即将快照数据写入磁盘)”。

因此,如果您只在数据库上运行少量请求(几乎没有要更改的数据),则使用 WiredTiger 的日志文件不应超过 100 MB 的低倍数。然而,日志文件的大小似乎不可配置。

于 2014-08-26T23:48:33.100 回答
10

mongodb从此演变。现在它的v3.4.1 稳定
我在v3.2上,方法如下:
取消注释# mmapv1:,看起来像:

  mmapv1:
    smallFiles: true 

如果您有不同的版本,请storage Optionsreference/configuration-options页面上查找。

不要忘记清空journal

sudo service mongodb stop
sudo rm -rf /var/lib/mongodb/journal/*
sudo service mongodb start
于 2017-01-22T21:06:15.700 回答