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

от автора

Привет Хабр, и привет читателям. Не очень долго пришлось ждать выхода моей новой статьи. Спасибо всем, кто дал 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+0300writing HABR2.posts to dump/HABR2/posts.bson.gz 2021-08-04T00:17:24.033+0300writing HABR2.phone to dump/HABR2/phone.bson.gz 2021-08-04T00:17:24.035+0300writing HABR2.addres to dump/HABR2/addres.bson.gz 2021-08-04T00:17:24.036+0300done dumping HABR2.posts (0 documents) 2021-08-04T00:17:24.036+0300done dumping HABR2.phone (0 documents) 2021-08-04T00:17:24.037+0300done 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+03000 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+0300writing HABR2.phone to dump/HABR2/phone.bson.gz 2021-08-04T00:16:41.483+0300writing HABR2.posts to dump/HABR2/posts.bson.gz 2021-08-04T00:16:41.484+0300done dumping HABR2.phone (0 documents) 2021-08-04T00:16:41.485+0300done dumping HABR2.posts (0 documents) 

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


ссылка на оригинал статьи https://habr.com/ru/articles/571138/