Подтвердить что ты не робот

Можно ли удалить файл журнала 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
4b9b3361

Ответ 1

TL; DR: У вас есть два варианта. Используйте параметр запуска --smallfiles при запуске MongoDB до ограничить размер файлов журнала до 128 МБ или отключите журналирование с помощью параметра --nojournal. Использование --nojournal в производстве - это, как правило, плохая идея, и часто имеет смысл использовать разные проблемы с записью и в разработке, поэтому у вас нет другого кода в dev и prod.

Длинный ответ: Нет, удаление файла журнала небезопасно. Идея журналирования такова:

Входит запись. Теперь, чтобы сделать запись постоянной (и прочную базу данных), запись должна каким-то образом перейти на диск.

К сожалению, запись на диск занимает eons по сравнению с записью в ОЗУ, поэтому в базе данных есть дилемма: не писать на диск рискованно, потому что неожиданное завершение работы приведет к потере данных. Но запись на диск для каждой отдельной операции записи настолько снижает производительность базы данных, что становится непригодной для практических целей.

Теперь вместо того, чтобы записывать сами файлы данных и вместо этого делать это для каждого запроса, база данных просто добавляется к файлу журнала, где он сохраняет все операции, которые еще не были привязаны к фактическим файлам данных. Это намного быстрее, потому что файл уже "горячий", так как он все время читается и записывается, и это только один файл, а не куча файлов, и, наконец, потому что он записывает все ожидающие операции в партии каждые 100 мс по умолчанию. Удаление этого файла в середине чего-то наносит ущерб.

Ответ 2

Как объясняется в ответе мнемосина, ведение журнала важно для двигателей хранения. К счастью, его можно контролировать в некоторой степени. Для механизма хранения 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 ограничивает файл журнала 128 МБ.

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

MongoDB >= 2.6 (Конфигурация YAML)

Если вы используете MMAPv1 с стиль конфигурации YAML, используйте тот же шаг для резервного копирования конфигурации, как указано выше, но в

  mmapv1:

конфигурационный блок, вставьте

    smallFiles: true 

. Впоследствии, действуйте так, как описано выше, перезагрузите сервер, удалив журналы.

WiredTiger (MongoDB >= 3.0, по умолчанию с 3.2)

В машинах разработки файлы журналов в WiredTiger по умолчанию несколько меньше, чем в MMAPv1, поскольку по умолчанию включена сжатие журнала. Согласно документации, "файлы журнала WiredTiger для MongoDB имеют максимальный размер, равный приблизительно 100 МБ". Он будет "создавать контрольные точки (т.е. Записывать данные моментального снимка на диск) с интервалом 60 секунд или 2 гигабайта данных журнала".

Таким образом, если вы используете только небольшое количество запросов (с небольшим количеством данных для изменения) в своей базе данных, файлы журнала, использующие WiredTiger, не должны превышать минимум 100 МБ. Однако размер файлов журнала не настраивается.

Ответ 3

mongodb развился с тех пор. Теперь его v3.4.1 stable.
Я здесь v3.2 здесь:
uncomment # mmapv1:, чтобы он выглядел так:

  mmapv1:
    smallFiles: true 

если у вас есть другая версия, найдите storage Options на странице reference/configuration-options.

не забывайте пустить journal

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