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

Kate

Administrator
Команда форума
Сегодня я хотел бы поделиться со всеми читателями об одной системе управления базами данных, не требующая описания схемы таблиц, правильно - это 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)

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

 
Сверху