Я хочу уменьшить размер файлов данных за счет восстановления удаленного пространства, но я не могу запустить db.repairDatabase()
, потому что свободного места на диске недостаточно.
Как восстановить удаленное пространство без `db.repairDatabase()`?
Ответ 1
Обновление: с WiredTiger compact
делает свободное пространство.
Оригинальный ответ на этот вопрос: Уменьшение размера файла базы данных MongoDB
На самом деле нет ничего, кроме repair
который позволит освободить место. compact
должен позволять вам идти гораздо дальше на существующее пространство. В противном случае вам придется перейти на более крупный диск.
Один из способов сделать это - использовать автономный вторичный ресурс из вашего набора реплик. Это должно дать вам полное окно обслуживания для миграции, ремонта, возврата и возврата.
Если вы не используете набор реплик, пришло время посмотреть на это.
Ответ 2
Вы можете запустить команду compact
в одной коллекции или по одному во всех коллекциях, которые вы хотите сжать.
http://www.mongodb.org/display/DOCS/Compact+Command
db.runCommand( { compact : 'mycollectionname' } )
Как отмечалось в комментариях, я ошибался, компактность фактически не освобождает дисковое пространство, он только дефрагментирует и перестраивает индексы коллекции.
Вместо этого вы можете использовать опцию "--repairpath", если у вас есть другой диск, доступный в свободном пространстве.
Например:
mongod --dbpath /data/db --repair --repairpath /data/db0
Показан здесь: http://docs.mongodb.org/manual/tutorial/recover-data-following-unexpected-shutdown/
Ответ 3
Вы также можете сделать ручной mongodump и mongorestore. Это в основном то же самое, что делает repairDatabase. Таким образом вы можете сбросить и восстановить его на/с другой машины с достаточным дисковым пространством.
Ответ 4
Если вы используете набор реплик, вам нужно будет выполнить повторную синхронизацию на каждом из ваших вторичных устройств по одному за раз. Как только это будет завершено, снимите свой основной и повторите синхронизацию вновь назначенного вторичного.
Чтобы выполнить повторную синхронизацию, остановите экземпляр mongod, удалите локали и запустите процесс резервного копирования. Следите за журналами, чтобы убедиться, что все началось правильно, и повторная инициализация началась.
Если у вас много данных/индексов, убедитесь, что ваш oplog достаточно велик, иначе он, вероятно, станет устаревшим.
Ответ 5
Есть еще один вариант, если вы используете набор реплик, но с большим количеством оговорок. Вы можете перейти к другому члену набора, а затем удалить файлы на прежнем первичном и выполнить полную повторную синхронизацию. Полная пересинхронизация перезаписывает файлы с нуля аналогично восстановлению, но вам также придется перестроить индексы. Это не должно быть сделано легко.
Если вы пойдет по этому пути, моя рекомендация состояла бы в том, чтобы установить набор из 3 членов, прежде чем делать это для рекультивации дискового пространства, так что в любое время, когда элемент синхронизируется с нуля, у вас есть 2 набора элементов, полностью функциональных.
Если у вас нет набора реплик, я рекомендую создать его с двумя секундантами. Когда вы сначала их синхронизируете, вы создадите приятные безразмерные и незакрепленные версии ваших данных. Подробнее здесь:
http://www.mongodb.org/display/DOCS/Replica+Set+Configuration