Импорт и экспорт баз данных MongoDB в Ubuntu 14.04

MongoDB – одна из самых популярных систем управления базами данных NoSQL. Она производительна, надёжна, проста в использовании и масштабировании. Данное руководство научит импортировать и экспортировать базы данных MongoDB.

Примечание: В данном руководстве данные будут перемещаться в удобном для восприятия человеком формате, совместимом с другими программами. В отличие от этого, операции резервного копирования и восстановления данных связаны с определенными двоичными данными MongoDB, которые отвечают не только за последовательность и целостность данных, но и за специфические параметры MongoDB. Таким образом, использовать резервное копирование и восстановление при миграции данных предпочтительнее в совместимых системах.

Требования

  • Сервер Ubuntu 14.04
  • Не-root пользователь с доступом к sudo
  • Предварительно установленная система управления базами данных MongoDB (инструкции по установке – здесь)

Базовые понятия

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

Для хранения информации MongoDB использует файлы json и bson (бинарный json). Json – это удобочитаемый для человека текстовый формат обмена данными. После перемещения данных в формате json ими можно управлять при помощи любого инструмента, поддерживающего такой формат.

Документ json выглядит так:

{"address":[
{"building":"1007", "street":"Park Ave"},
{"building":"1008", "street":"New Ave"},
]}

С форматом json очень удобно работать, однако он не поддерживает всех типов данных, поддерживаемых bson. Это значит, что при передаче данных может произойти потеря точности. Потому для создания и восстановления бэкапа рекомендуется использовать формат bson.

В системе MongoDB не нужно явно создавать БД. Если БД, указанная в импорте, ещё не существует, система создаст её автоматически. Ещё проще дела обстоят с коллекциями (таблицами). В отличие от остальных систем управления базами данных, MongoDB автоматически создаёт структуру при внесении первой строки.

Чтение или внесение больших объёмов данных в MongoDB может быть очень затратным и потребить большую часть CPU, памяти и дискового пространства. Учитывая, что MongoDB часто используется для работы с Big Data, это критическая проблема. Самое простое её решение – выполнять экспорт и бэкап данных во время низкого трафика (например, ночью).

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

Импорт данных MongoDB

Для примера используем один из образцов базы данных MongoDB. Загрузите файл json:

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

После завершения загрузки в текущем каталоге появится файл primer-dataset.json (12 MB). Попробуйте импортировать данные из этого файла в новую БД (в данном руководстве она называется 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 не существовало, СУБД создала её автоматически.

Чтобы убедиться, что импорт данных прошёл успешно, подключитесь к новой БД:

sudo mongo newdb

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

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

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"
}

Такая подробная проверка может выявить такие проблемы, как повреждение контента документа, несогласованность данных и т.п. Формат The json использует кодирование UTF-8, потому импортировать и экспортировать данные нужно именно с таким шифрованием. В противном случае MongoDB установит это шифрование автоматически.

Чтобы закрыть командную строку MongoDB, введите:

exit

Эта команда вернёт вас в обычную командную строку системы.

Экспорт данных MongoDB

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

Для экспорта данных MongoDB используется команда mongoexport. Она позволяет выполнить подробный экспорт данных: указать имя БД, коллекцию, поле, и даже запрос.

Давайте попробуем экспортировать коллекцию restaurants из базы данных newdb:

sudo mongoexport --db newdb -c restaurants --out newdbexport.json

Флаг –db позволяет указать имя БД, флаг -c указывает коллекцию, –out задаёт файл, в который нужно сохранить данные.

В случае успешного перемещения данных команда вернёт:

2016-01-20T03:39:00.143-0500    connected to: localhost
2016-01-20T03:39:03.145-0500    exported 25359 records

Согласно выводу команды, было экспортировано 25359 документов. Как видите, это совпадает с количеством импортированных документов.

В некоторых случаях нужно экспортировать только часть коллекции. Учитывая структуру и содержание файла restaurants, попробуйте экспортировать все документы, содержащие информацию о китайских ресторанах, находящихся в Бронксе. Чтобы получить эти данные, оставаясь в MongoDB, создайте соединение с БД:

sudo mongo newdb

Затем создайте запрос:

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

Результат будет выведен в терминал. Чтобы закрыть командную строку MongoDB, введите:

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; это делается за счёт ведомых (или slave) серверов MongoDB. В процессе репликации задействованы логи operations (или oplog), которые хранят все операции, изменившие данные. Эти файлы можно использовать для восстановления данных.

Имейте в виду: резервное копирование, как правило, выполняется в ночное время; если вы решите восстановить резервную копию в вечернее время, вы потеряете все обновления данных с момента последнего резервного копирования.

Tags: , ,

Добавить комментарий