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

Как восстановить удаленное пространство без `db.repairDatabase()`?

Я хочу уменьшить размер файлов данных за счет восстановления удаленного пространства, но я не могу запустить db.repairDatabase(), потому что свободного места на диске недостаточно.

4b9b3361

Ответ 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