Импорт и экспорт баз данных MongoDB в Ubuntu 14.04
Ubuntu | Комментировать запись
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
- Бэкап, восстановление и перемещение данных MongoDB в Ubuntu 14.04
Репликация данных полезна не только при масшабировании, она также может пригодиться в повседневной работе. Репликация данных позволяет поддерживать работу приложения в случае сбоя сервера MongoDB; это делается за счёт ведомых (или slave) серверов MongoDB. В процессе репликации задействованы логи operations (или oplog), которые хранят все операции, изменившие данные. Эти файлы можно использовать для восстановления данных.
Имейте в виду: резервное копирование, как правило, выполняется в ночное время; если вы решите восстановить резервную копию в вечернее время, вы потеряете все обновления данных с момента последнего резервного копирования.
Tags: MongoDB, NoSQL, Ubuntu 14.04