2013-07-26 4 views
1

Я подключаюсь к удаленному серверу MongoDB, импортируя все элементы из него в локальную базу данных, а затем очищая его.Импортировать и очистить базу данных MongoDB

Есть ли более безопасный и эффективный способ сделать это?

mongoexport -h 1.2.3.4 -d foo -c bar | mongoimport -d foo -c bar 
mongo 1.2.3.4/foo --eval "db.bar.remove()" 
mongo 1.2.3.4/foo --eval "db.repairDatabase()" # To free up disk space 

Удаленная база данных значительно меньше, чем тот, который я импортирующей в, так репликация не кажется, как вариант.

+0

Чтобы уточнить, ваша удаленная база данных очень мала, поэтому вы используете ее для захвата данных в течение некоторого времени, а затем перемещения этих данных на ваш локальный сервер, на котором больше дискового пространства? Это верно? Кроме того, какова природа вашего приложения? – sfritter

+0

@sfritter: Да. Это сервер Amazon EC2 с 8 ГБ дискового пространства, который я использую для агрегирования данных. – Blender

+0

Можете ли вы рассказать мне немного больше о вашем случае использования? Что происходит с данными после его перемещения, например, и какое приложение взаимодействует с экземпляром Amazon. Есть более эффективные способы достижения того, что вы делаете, но чем больше я знаю о вашем случае использования, тем лучше я могу вам посоветовать :) – sfritter

ответ

1

Ну, я полагаю, я бы сначала переключился с использования mongoexport/mongoimport на использование mongodump/mongorestore. Mongodump быстрее, а также сохранит все богатые типы данных BSON, в отличие от mongoexport.

Кроме того, команда db.bar.remove() проверит ваш документ коллекции по документу и отбросит каждый из них. Поскольку вы действительно хотите просто избавиться от всего, вы можете сделать это намного быстрее на dropping the entire collection оптом с db.bar.drop(). Это намного быстрее. Тем не менее, при отбрасывании коллекции также будут удалены любые индексы, которые вы создали для нее, поэтому вам нужно будет воссоздать их позже.

Для каждой задачи вам не нужно запускать db.repairDatabase() после того, как MongoDB вернет освобожденное пространство из вашей коллекции. Что вы можете сделать, так это использовать compact (http://docs.mongodb.org/manual/reference/command/compact/) для дефрагментации освобожденного пространства. Кроме того, вы можете попробовать использовать флаг usePowerOf2Sizes для этой коллекции, что должно помочь более эффективно использовать пространство повторного использования MongoDB (http://docs.mongodb.org/manual/reference/command/collMod/).

Репликация не является тем, что вы ищете. С репликацией мы запускаем несколько серверов, на которых все содержат копии одних и тех же данных, а не подмножества набора данных. Это в основном полезно для аварийного восстановления и восстановления после сбоя и не поможет в вашем случае.

+0

Складывает ли базы данных 'mongodump' /' mongorestore' или заменяет их? – Blender

+0

Если вы не используете опцию '--drop', mongorestore объединит ваши данные. – sfritter

Смежные вопросы