Привет Хабр, и привет читателям. Не очень долго пришлось ждать выхода моей новой статьи. Спасибо всем, кто дал 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)
AnisimovAndrey
04.08.2021 12:26+1Было бы неплохо перечислить все доступные виды бекапа, а так же указать подходят ли данные способы для бекапа шард.
Это горячие или хододные бекапы? Если горячие, то обеспечивается ли согласованность? Посмотрите опцию --oplog/--oplogReplay
MountyPiton
04.08.2021 14:02Есть у меня такое подозрение что 7 разных ключей к команде dump - это не 7 способов резервного копирования. Может имеет смысл рассмотреть остальные методы резервного копирования?
JuriM
05.08.2021 02:06Я не думаю что вы будете снимать бэкапы терабайтной базы монгодампом каждый раз, учитывая что монгодб не умеет инкрементальные бэкапы. И монгодамп не рекомендуют использовать сами авторы, если у вас кластер.
rudinandrey
что то не так с вашей Mongo :( может конечно со мной что-то не так, но думаю что с монгой.
сервер VDS Ubuntu 20.04, по документации ставлю последнюю монгу, не работает. все поудалял, apt вроде нормально опять заработал. Ну думаю криворукий, чо. Сейчас прочитал Вашу статью, опять решил попробовать, но думаю лучше все таки через докер.
этот код скопировал с официальной документации, запускаю, не запускается.
Ошибка: No log line matching the '' filter
это все :( что с ней дальше делать? (((
arkhiiipov Автор
Через докер не пробовал. У меня проблем не было, во время установки MongoDB;) по оф гайду делали ?
rudinandrey
да, можно было из apt поставить ту что предлагает, тоже в принципе не самая старая, но я захотел самую последнюю, но у меня ничего не получилось.