Как импортировать и экспортировать базу данных MongoDB в Ubuntu 14.04
MongoDB — один из самых популярных движков баз данных NoSQL. Он известен своей масштабируемостью, мощностью, надежностью и простотой в использовании. В этой статье мы покажем вам, как импортировать и экспортировать базы данных MongoDB.
Следует пояснить, что под импортом и экспортом в этой статье мы подразумеваем работу с данными в удобочитаемом формате, совместимом с другими программными продуктами. Напротив, операции резервного копирования и восстановления создают или используют определенные двоичные данные MongoDB, которые сохраняют не только согласованность и целостность ваших данных, но и их определенные атрибуты MongoDB. Таким образом, для миграции обычно предпочтительнее использовать резервное копирование и восстановление, если исходная и целевая системы совместимы. Резервное копирование, восстановление и миграция выходят за рамки этой статьи — см. Как выполнить резервное копирование, восстановление и миграцию базы данных MongoDB в Ubuntu 14.04.
Предпосылки
Прежде чем следовать этому руководству, убедитесь, что выполнены следующие предварительные условия:
- Дроплет Ubuntu 14.04
- Пользователь sudo без полномочий root. Подробности см. в разделе Первоначальная настройка сервера с Ubuntu 14.04.
- MongoDB установлен и настроен с помощью статьи Как установить MongoDB в Ubuntu 14.04.
Если не указано иное, все команды, требующие привилегий root в этом руководстве, должны выполняться от имени пользователя без полномочий root с привилегиями sudo.
Понимание основ
Прежде чем продолжить изучение этой статьи, необходимо иметь некоторое базовое представление об этом вопросе. Если у вас есть опыт работы с популярными системами реляционных баз данных, такими как MySQL, вы можете найти некоторые сходства при работе с MongoDB.
Первое, что вы должны знать, это то, что MongoDB использует форматы json и bson (двоичный json) для хранения своей информации. Json — это удобочитаемый формат, который идеально подходит для экспорта и, в конечном итоге, импорта ваших данных. Вы можете дополнительно управлять своими экспортированными данными с помощью любого инструмента, поддерживающего json, включая простой текстовый редактор.
Пример json-документа выглядит так:
{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}
С Json очень удобно работать, но он поддерживает не все типы данных, доступные в bson. Это означает, что будет так называемая «потеря достоверности» информации, если вы используете json. Поэтому для резервного копирования/восстановления лучше использовать бинарный bson, который сможет лучше восстановить вашу базу данных MongoDB.
Во-вторых, вам не нужно беспокоиться о явном создании базы данных MongoDB. Если база данных, которую вы укажете для импорта, еще не существует, она будет создана автоматически. Еще лучше дело обстоит со структурой коллекций (таблиц базы данных). В отличие от других механизмов баз данных, в MongoDB структура снова создается автоматически при вставке первого документа (строки базы данных).
В-третьих, в MongoDB чтение или вставка больших объемов данных, например, для задач, описанных в этой статье, может быть ресурсоемким и потреблять много ресурсов ЦП, памяти и дискового пространства. Это очень важно, учитывая, что MongoDB часто используется для больших баз данных и больших данных. Самое простое решение этой проблемы — запустить экспорт/резервное копирование в ночное время.
В-четвертых, непротиворечивость информации может быть проблематичной, если у вас загруженный сервер MongoDB, где информация меняется в процессе экспорта базы данных. У этой проблемы нет простого решения, но в конце этой статьи вы увидите рекомендации по дальнейшему прочтению информации о репликации.
Импорт информации в MongoDB
Чтобы узнать, как работает импорт информации в MongoDB, давайте воспользуемся популярным образцом базы данных MongoDB о ресторанах. Он имеет формат .json и может быть загружен с помощью wget
следующим образом:
- wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json
После завершения загрузки у вас должен быть файл с именем primer-dataset.json
(размер 12 МБ) в текущем каталоге. Давайте импортируем данные из этого файла в новую базу данных с именем newdb
и в коллекцию с именем restaurants
. Для импорта мы будем использовать команду mongoimport
следующим образом:
- sudo mongoimport --db newdb --collection restaurants --file primer-dataset.json
Результат должен выглядеть так:
2016-01-17T14:27:04.806-0500 connected to: localhost
2016-01-17T14:27:07.315-0500 imported 25359 documents
Как показывает приведенная выше команда, было импортировано 25359 документов. Поскольку у нас не было базы данных с именем newdb
, MongoDB создала ее автоматически.
Давайте проверим импорт, подключившись к только что созданной базе данных MongoDB с именем newdb
следующим образом:
- sudo mongo newdb
Теперь вы подключены к только что созданному экземпляру базы данных newdb
. Обратите внимание, что ваше приглашение изменилось, указывая на то, что вы подключены к базе данных.
Подсчитайте документы в коллекции ресторанов с помощью команды:
- db.restaurants.count()
В результате должно появиться 25359
, точное количество импортированных документов. Для еще лучшей проверки вы можете выбрать первый документ из коллекции ресторанов следующим образом:
- db.restaurants.findOne()
Результат должен выглядеть так:
{
"_id" : ObjectId("569beb098106480d3ed99926"),
"address" : {
"building" : "1007",
"coord" : [
-73.856077,
40.848447
],
"street" : "Morris Park Ave",
"zipcode" : "10462"
},
"borough" : "Bronx",
"cuisine" : "Bakery",
"grades" : [
{
"date" : ISODate("2014-03-03T00:00:00Z"),
"grade" : "A",
"score" : 2
},
...
],
"name" : "Morris Park Bake Shop",
"restaurant_id" : "30075445"
}
Такая детальная проверка может выявить проблемы с документами, такими как их содержимое, кодировка и т. д. Формат json использует кодировку UTF-8
, и ваши экспорты и импорты должны быть в этой кодировке. Имейте это в виду, если вы вручную редактируете файлы json. В противном случае MongoDB автоматически сделает это за вас.
Чтобы выйти из приглашения MongoDB, введите exit
в приглашении:
- exit
Вы вернетесь к обычному приглашению командной строки в качестве пользователя без полномочий root.
Экспорт информации из MongoDB
Как мы упоминали ранее, экспортируя информацию MongoDB, вы можете получить удобочитаемый текстовый файл с вашими данными. По умолчанию информация экспортируется в формате json, но вы также можете экспортировать в csv (значения, разделенные запятыми).
Чтобы экспортировать информацию из MongoDB, используйте команду mongoexport
. Это позволяет вам экспортировать очень детализированный экспорт, чтобы вы могли указать базу данных, коллекцию, поле и даже использовать запрос для экспорта.
Простым примером mongoexport
может быть экспорт коллекции ресторанов из базы данных newdb
, которую мы ранее импортировали. Это можно сделать следующим образом:
- sudo mongoexport --db newdb -c restaurants --out newdbexport.json
В приведенной выше команде мы используем --db
для указания базы данных, -c
для коллекции и --out
для файла, в котором данные будут сохранены.
Вывод успешного mongoexport
должен выглядеть следующим образом:
2016-01-20T03:39:00.143-0500 connected to: localhost
2016-01-20T03:39:03.145-0500 exported 25359 records
Приведенный выше вывод показывает, что было импортировано 25359 документов — столько же, сколько и импортированных.
В некоторых случаях вам может понадобиться экспортировать только часть вашей коллекции. Учитывая структуру и содержимое файла json с ресторанами, давайте экспортируем все рестораны, которые соответствуют критериям расположения в районе Бронкса и китайской кухни. Если мы хотим получить эту информацию напрямую при подключении к MongoDB, снова подключитесь к базе данных:
- sudo mongo newdb
Затем используйте этот запрос:
db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )
Результаты отображаются на терминале. Чтобы выйти из приглашения MongoDB, введите exit
в приглашении:
- exit
Если вы хотите экспортировать данные из командной строки sudo, а не при подключении к базе данных, сделайте предыдущий запрос частью команды mongoexport
, указав его для -q
такой аргумент:
- sudo mongoexport --db newdb -c restaurants -q "{ borough: 'Bronx', cuisine: 'Chinese' }" --out Bronx_Chinese_retaurants.json
Обратите внимание, что мы используем одинарные кавычки внутри двойных кавычек для условий запроса. Если вы используете двойные кавычки или специальные символы, такие как $
, вам придется экранировать их обратной косой чертой (\
) в запросе.
Если экспорт прошел успешно, результат должен выглядеть так:
2016-01-20T04:16:28.381-0500 connected to: localhost
2016-01-20T04:16:28.461-0500 exported 323 records
Выше показано, что было экспортировано 323 записи, и вы можете найти их в файле Bronx_Chinese_retaurants.json
, который мы указали.
Заключение
Эта статья познакомила вас с основами импорта и экспорта информации в базу данных MongoDB и из нее. Вы можете продолжить чтение о том, как настроить масштабируемую базу данных MongoDB.
Репликация не только полезна для масштабируемости, но также важна для текущих тем. Репликация позволяет вам продолжать бесперебойную работу службы MongoDB с подчиненного сервера MongoDB, пока вы восстанавливаете главный сервер после сбоя. Частью репликации также является журнал операций (oplog), в котором записываются все операции, изменяющие ваши данные. Вы можете использовать этот журнал так же, как вы использовали бы двоичный журнал в MySQL, для восстановления ваших данных после последнего резервного копирования. Напомним, что резервное копирование обычно происходит ночью, и если вы решите восстановить резервную копию вечером, вы потеряете все обновления с момента последнего резервного копирования.