Привет Хабр, и привет читателям. Не очень долго пришлось ждать выхода моей новой статьи. Спасибо всем, кто дал 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)

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

Комментарии (11)


  1. rudinandrey
    04.08.2021 10:55

    что то не так с вашей Mongo :( может конечно со мной что-то не так, но думаю что с монгой.

    сервер VDS Ubuntu 20.04, по документации ставлю последнюю монгу, не работает. все поудалял, apt вроде нормально опять заработал. Ну думаю криворукий, чо. Сейчас прочитал Вашу статью, опять решил попробовать, но думаю лучше все таки через докер.

    version: '3.1'
    
    services:
    
      mongo:
        image: mongo
        restart: always
        environment:
          MONGO_INITDB_ROOT_USERNAME: root
          MONGO_INITDB_ROOT_PASSWORD: example

    этот код скопировал с официальной документации, запускаю, не запускается.

    Ошибка: No log line matching the '' filter

    это все :( что с ней дальше делать? (((


    1. arkhiiipov Автор
      04.08.2021 10:58

      Через докер не пробовал. У меня проблем не было, во время установки MongoDB;) по оф гайду делали ?


      1. rudinandrey
        04.08.2021 15:47

        да, можно было из apt поставить ту что предлагает, тоже в принципе не самая старая, но я захотел самую последнюю, но у меня ничего не получилось.


  1. anonymous
    00.00.0000 00:00


  1. AnisimovAndrey
    04.08.2021 12:26
    +1

    Было бы неплохо перечислить все доступные виды бекапа, а так же указать подходят ли данные способы для бекапа шард.

    Это горячие или хододные бекапы? Если горячие, то обеспечивается ли согласованность? Посмотрите опцию --oplog/--oplogReplay


  1. MountyPiton
    04.08.2021 14:02

    Есть у меня такое подозрение что 7 разных ключей к команде dump - это не 7 способов резервного копирования. Может имеет смысл рассмотреть остальные методы резервного копирования?


  1. TroLLik
    04.08.2021 15:41

    дампы != бакапы. рекомендую смотреть в сторону walg


  1. Roman2dot0
    04.08.2021 20:55

    Для бэкапов есть OpsManager


  1. JuriM
    05.08.2021 02:06

    Я не думаю что вы будете снимать бэкапы терабайтной базы монгодампом каждый раз, учитывая что монгодб не умеет инкрементальные бэкапы. И монгодамп не рекомендуют использовать сами авторы, если у вас кластер.


    1. eaa
      25.10.2021 23:14

      А есть инструмент для бэкапа терабайтных баз? Как раз возникла потребность в таком.


      1. korzunin
        26.10.2021 12:47

        Percona Backup for MongoDB попробуйте