Поиск по сайту:

Как импортировать и экспортировать базу данных 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 следующим образом:

  1. wget https://raw.githubusercontent.com/mongodb/docs-assets/primer-dataset/primer-dataset.json

После завершения загрузки у вас должен быть файл с именем primer-dataset.json (размер 12 МБ) в текущем каталоге. Давайте импортируем данные из этого файла в новую базу данных с именем newdb и в коллекцию с именем restaurants. Для импорта мы будем использовать команду mongoimport следующим образом:

  1. 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 следующим образом:

  1. sudo mongo newdb

Теперь вы подключены к только что созданному экземпляру базы данных newdb. Обратите внимание, что ваше приглашение изменилось, указывая на то, что вы подключены к базе данных.

Подсчитайте документы в коллекции ресторанов с помощью команды:

  1. db.restaurants.count()

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

  1. 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 в приглашении:

  1. exit

Вы вернетесь к обычному приглашению командной строки в качестве пользователя без полномочий root.

Экспорт информации из MongoDB

Как мы упоминали ранее, экспортируя информацию MongoDB, вы можете получить удобочитаемый текстовый файл с вашими данными. По умолчанию информация экспортируется в формате json, но вы также можете экспортировать в csv (значения, разделенные запятыми).

Чтобы экспортировать информацию из MongoDB, используйте команду mongoexport. Это позволяет вам экспортировать очень детализированный экспорт, чтобы вы могли указать базу данных, коллекцию, поле и даже использовать запрос для экспорта.

Простым примером mongoexport может быть экспорт коллекции ресторанов из базы данных newdb, которую мы ранее импортировали. Это можно сделать следующим образом:

  1. 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, снова подключитесь к базе данных:

  1. sudo mongo newdb

Затем используйте этот запрос:

db.restaurants.find( { borough: "Bronx", cuisine: "Chinese" } )

Результаты отображаются на терминале. Чтобы выйти из приглашения MongoDB, введите exit в приглашении:

  1. exit

Если вы хотите экспортировать данные из командной строки sudo, а не при подключении к базе данных, сделайте предыдущий запрос частью команды mongoexport, указав его для -q такой аргумент:

  1. 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, для восстановления ваших данных после последнего резервного копирования. Напомним, что резервное копирование обычно происходит ночью, и если вы решите восстановить резервную копию вечером, вы потеряете все обновления с момента последнего резервного копирования.