Как стать автором
Обновить

MongoDB — Захватывает мир. Семь способов резервного копирования и восстановления данных

Время на прочтение6 мин
Количество просмотров17K

Привет Хабр, и привет читателям. Не очень долго пришлось ждать выхода моей новой статьи. Спасибо всем, кто дал feedback по моей прошлой статье.

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

Сегодня я хотел бы поделиться со всеми читателями об одной системе управления базами данных, не требующая описания схемы таблиц, правильно - это MongoDB СУБД считается одной из классических примеров NoSQL-систем. Документы состоят из пар ключ-значение, которые являются основной единицей данных в MongoDB. Коллекции содержат наборы документов и функции, которые эквивалентны таблицам реляционной базы данных. MongoDB — это база данных, появившаяся в середине 2000-х годов. Про установку не буду ничего описывать все и так понятно из официального гайда Всем добро пожаловать.
https://docs.mongodb.com/v5.0/administration/install-community/

В этой статье буду показывать о том, как настроить резервное копирование данных, и потом восстановить. На самом деле это не так все сложно, и даже скажу больше интуитивно понятно:) Не буду задерживать всех своей писаниной и сразу приступим к делу. Мануал заточен на то, что у вас уже установлена СУБД из официального гайда. Единственное скажу, что я буду показывать все на машинке с Линуксом, ОС Ubuntu 20.04.2 LTS

Формат данных в MongoDB

Одним из популярных стандартов обмена данными и их хранения является JSON (JavaScript Object Notation). JSON эффективно описывает сложные по структуре данные. Способ хранения данных в MongoDB в этом плане похож на JSON, хотя формально JSON не используется. Для хранения в MongoDB применяется формат, который называется BSON (БиСон) или сокращение от binary JSON.

BSON позволяет работать с данными быстрее: быстрее выполняется поиск и обработка. Хотя надо отметить, что BSON в отличие от хранения данных в формате JSON имеет небольшой недостаток: в целом данные в JSON-формате занимают меньше места, чем в формате BSON, с другой стороны, данный недостаток с лихвой окупается скоростью.

Подключаемся к нашей СУБД, создадим для Резервной копии три базы данных под названием HABR1, HABR2, HABR3. Для наполнения этих бд создадим пару коллекций.

root@backup-server:~# mongo

> use HABR
db.createCollection("posts")
db.createCollection("address")
db.createCollection("phone")

> use HABR2
db.createCollection("posts2")
db.createCollection("address2")
db.createCollection("phone2")

> use HABR3
db.createCollection("posts3")
db.createCollection("address3")
db.createCollection("phone3")
db.createCollection("phonehabr")


Создали бд, проверим, все ли нормально с ними :)
> show dbs

switched to db admin
admin> show dbs
HABR         57.3 kB
HABR2        24.6 kB
HABR3        24.6 kB
admin         184 kB
config       73.7 kB
local        81.9 kB

Как мы видим наши бд создались, давайте проверим есть ли в них коллекции которые мы создавали ранее.

admin> use HABR
switched to db HABR
HABR> show collections
addreshabr
address3
addresshabr
phone5
phonehabr
posts
postshabr
HABR> use HABR2
switched to db HABR2
HABR2> show collections
addres
phone
posts
HABR2> use HABR3
switched to db HABR3
HABR3> show collections
addres3
phone3
posts3

Все коллекции на месте. Можно приступать к первому варианту Резервной копии.
Резервную копию будем делать из под рута.

Делается все одной командой:

mongodump --host=localhost --gzip -d HABR --archive=/tmp/backup-db-habr.gz

root@backup-server:/tmp/test# ls -la
total 20
drwxr-xr-x  2 root root 4096 Aug  3 18:33 .
drwxrwxrwt 13 root root 4096 Aug  3 18:32 ..
-rw-r--r--  1 root root  638 Aug  3 18:32 backup-db-habr.gz
-rw-r--r--  1 root root  416 Aug  3 18:33 backup-db-habr2.gz
-rw-r--r--  1 root root  423 Aug  3 18:33 backup-db-habr3.gz

Как видим, Резервная Копия создалась успешно.

Восстановление из такого бэкапа.

mongorestore --gzip --archive=backup-db-habr.gz

В данном примере делаем Резервную копию одной командой, и складываем в архив, есть несколько вариантов, как можно сделать резервное копирование, постараюсь описать в этой статье как можно больше вариантов.

Способ 2 - Резервное копирование всех баз данных, без сжатия данных.

Создадим директорию хранения такого бэкапа
mkdir -p /tmp/backup/
Запустим резервное копирование:
mongodump --out /tmp/backup/

После успешного резервного копирования перейдем в директорию с нашей базой и посмотрим что там лежит. Все правильно здесь хранятся коллекции БЕЗ СЖАТИЯ в BSON и JSON формате.

root@backup-server:/tmp/backup/HABR# ls -la
total 36
drwxr-xr-x 2 root root 4096 Aug  3 21:08 .
drwxr-xr-x 5 root root 4096 Aug  3 21:09 ..
-rw-r--r-- 1 root root    0 Aug  3 21:08 addreshabr.bson
-rw-r--r-- 1 root root  177 Aug  3 21:08 addreshabr.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 address3.bson
-rw-r--r-- 1 root root  175 Aug  3 21:08 address3.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 addresshabr.bson
-rw-r--r-- 1 root root  178 Aug  3 21:08 addresshabr.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 phone5.bson
-rw-r--r-- 1 root root  173 Aug  3 21:08 phone5.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 phonehabr.bson
-rw-r--r-- 1 root root  176 Aug  3 21:08 phonehabr.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 posts.bson
-rw-r--r-- 1 root root  172 Aug  3 21:08 posts.metadata.json
-rw-r--r-- 1 root root    0 Aug  3 21:08 postshabr.bson
-rw-r--r-- 1 root root  176 Aug  3 21:08 postshabr.metadata.json

Восстановление из такого бэкапа:
mongorestore --drop --dir /tmp/backup

Параметр --drop используется для удаления коллекции перед импортом(если она существует),во избежания ошибки duplicate key errors Этот параметр --drop следует применять с осторожностью.

Восстановление определенной коллекции (например, коллекции postshabr в базе данных HABR) с бекапа всех баз данных:

mongorestore --drop -v --dir /root/backup --nsInclude 'habr.postshabr'

Восстановление всех баз данных и всех коллекций, за исключением определенной коллекции(например, коллекции postshabr в базе habrdb)

mongorestore --drop -v --dir /root/backup --nsExclude 'habr.postshabr'

Способ 3 - Резервное копирование всех баз данных с сжатием.

mongodump --gzip --out /tmp/backup

root@backup-server:/tmp/backup/HABR# ls -la
total 44
drwxr-xr-x  2 root root 4096 Aug  3 21:51 .
drwxr-xr-x 13 root root 4096 Aug  3 21:51 ..
-rw-r--r--  1 root root    0 Aug  3 21:08 addres.bson
-rw-r--r--  1 root root   23 Aug  3 21:51 addres.bson.gz
-rw-r--r--  1 root root  173 Aug  3 21:08 addres.metadata.json
-rw-r--r--  1 root root  152 Aug  3 21:51 addres.metadata.json.gz
-rw-r--r--  1 root root    0 Aug  3 21:08 phone.bson
-rw-r--r--  1 root root   23 Aug  3 21:51 phone.bson.gz
-rw-r--r--  1 root root  172 Aug  3 21:08 phone.metadata.json
-rw-r--r--  1 root root  151 Aug  3 21:51 phone.metadata.json.gz
-rw-r--r--  1 root root    0 Aug  3 21:08 posts.bson
-rw-r--r--  1 root root   23 Aug  3 21:51 posts.bson.gz
-rw-r--r--  1 root root  172 Aug  3 21:08 posts.metadata.json
-rw-r--r--  1 root root  153 Aug  3 21:51 posts.metadata.json.gz

Восстановление с такого бекапа.

mongorestore --gzip --drop --dir /mnt/backup

Способ 4 - Резервное копирование всех баз данных с сжатием в один архив(.gz)

mongodump --gzip --archive=/tmp/backup/mybackup.gz

Восстановление с такого бекапа:

mongorestore --gzip --drop --archive=/tmp/backup/mybackup.gz

Способ 5 - Резервное копирование определенной базы данных.

mongodump --gzip -d HABR2

root@backup-server:/tmp/backup/dump/HABR2# mongodump --gzip -d HABR2
2021-08-04T00:17:24.033+0300	writing HABR2.posts to dump/HABR2/posts.bson.gz
2021-08-04T00:17:24.033+0300	writing HABR2.phone to dump/HABR2/phone.bson.gz
2021-08-04T00:17:24.035+0300	writing HABR2.addres to dump/HABR2/addres.bson.gz
2021-08-04T00:17:24.036+0300	done dumping HABR2.posts (0 documents)
2021-08-04T00:17:24.036+0300	done dumping HABR2.phone (0 documents)
2021-08-04T00:17:24.037+0300	done dumping HABR2.addres (0 documents)

Восстановление с такого бекапа:

mongorestore --gzip --dir /tmp/backup/

Способ 6 - Резервное копирование одной коллекции address из базы данных HABR2.

mongodump --gzip -d HABR2 -c address

root@backup-server:/tmp/backup/dump/HABR2# ls -la
total 16
drwxr-xr-x 2 root root 4096 Aug  3 22:05 .
drwxr-xr-x 3 root root 4096 Aug  3 22:05 ..
-rw-r--r-- 1 root root   23 Aug  3 22:05 addres.bson.gz
-rw-r--r-- 1 root root  152 Aug  3 22:05 addres.metadata.json.gz

Просмотр содержимого bson-файла:

zcat posts.bson.gz | bsondump --pretty

root@backup-server:/# zcat posts.bson.gz | bsondump --pretty
2021-08-03T22:23:57.113+0300	0 objects found

Способ 7 - Бекап всей базы HABR2 за исключением одной коллекции address

mongodump --gzip -d HABR2 --excludeCollection=address

root@backup-server:/tmp/backup/dump/HABR2# mongodump --gzip -d HABR2 --excludeCollection=addres
2021-08-04T00:16:41.482+0300	writing HABR2.phone to dump/HABR2/phone.bson.gz
2021-08-04T00:16:41.483+0300	writing HABR2.posts to dump/HABR2/posts.bson.gz
2021-08-04T00:16:41.484+0300	done dumping HABR2.phone (0 documents)
2021-08-04T00:16:41.485+0300	done dumping HABR2.posts (0 documents)

Надеюсь, что любому кто столкнется с такой задачей, прочитав эту статью будет понятно, как работать с этой СУБД. Всем спасибо за чтение данной статьи!

Теги:
Хабы:
Всего голосов 6: ↑4 и ↓2+2
Комментарии11

Публикации

Истории

Работа

Ближайшие события

27 августа – 7 октября
Премия digital-кейсов «Проксима»
МоскваОнлайн
20 – 22 сентября
BCI Hack Moscow
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
24 сентября
Astra DevConf 2024
МоскваОнлайн
25 сентября
Конференция Yandex Scale 2024
МоскваОнлайн
28 – 29 сентября
Конференция E-CODE
МоскваОнлайн
28 сентября – 5 октября
О! Хакатон
Онлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн
3 – 18 октября
Kokoc Hackathon 2024
Онлайн
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн