20
апреля
4

Резервное копирование данных MongoDB



Существует несколько способов создания бекапа информации, находящейся в БД mongo. Наилучшим способом для регулярного использования, т. е. без простоя/блокирования/остановки сервиса, является использование утилиты mongodump. Она действует по принципу, как и утилита mysqldump в MySQL, делая бекап/дамп данных c работающего/используемого в данный момент сервера. Дамп в последующем может быть восстановлен с помощью утилиты mongorestore, которая также идет в комлекте поставки.

Лучше всего после внедрения сервиса, использующего mongodb, сразу настроить репликацию master-slave и в дальнейшем резервные копии снимать с подчиненного сервера, чтобы не нагружать главный сервер, работающий кроме чтения еще и на запись. Кроме того, slave-сервер будет очень полезен, если неожиданно «умрет» master-сервер, так как сделать его новым главным сервером достаточно простая процедура (подчиненный сервер выступает в качестве failover-а).

Прежде чем использовать утилиты желательно заглянуть в помощь по ним.

Mongodump:

# mongodump --help 

Опции:

help вызов справки
-v [ —verbose ] — выводить больше информации (например, для большей детализации необходимо использовать -vvvvv)
-h [ —host ] — хост mongo для соединения («left,right», если используется replica+sets)
—port — порт сервера, также возможно использовать —host hostname:port
-d [ —db ] — указать базу данных
-c [ —collection ] — указать используемые таблицы
-u [ —username ] — имя пользователя
-p [ —password ] — пароль
—ipv6 — включить поддержку IPv6 (по умолчанию отключена)
—dbpath — прямой доступ к файлам базы mongod по указанному пути, вместо конекта к серверу mongod. Необходима блокировка директории с данными, поэтому не может быть использована если монго-сервер использует базу по указнному пути
—directoryperdb — если задан аргумент dbpath, то каждая БД находится в отдельной директории
-o [ —out ] — (=dump) директория вывода
-q [ —query ] — запрос json

Mongodump, как видим, может подключаться к определенному хосту (—host), не обязательно локальному (если не задан —host), и можно задать базу данных (—db), резервную копию которой нужно сделать, либо ее коллекцию/таблицу (—collection). Если БД не указывается, то это подразумевает все базы данных. Будет полезным указать директорию в которую должен происходить бекап (—out), который по умолчанию делается в текущей директории запуска утилиты в dump/. По окончанию работы mongodump получаем директорию(и) под названием БД с файлами в формате BSON.

Mongorestore:

# mongorestore --help
usage: mongorestore [options] [directory or filename to restore from] 

Опции:

—help — вызов справки
-v [ —verbose ] – выводить больше информации (например, для большей детализации необходимо использовать -vvvvv)
-h [ —host ] – хост mongo для соединения («left,right», если используется replica+sets)
—port – порт сервера, также возможно использовать –host hostname:port
-d [ —db ] – указать базу данных
-c [ —collection ] – указать используемые таблицы
-u [ —username ] – имя пользователя
-p [ —password ] – пароль
–ipv6 – включить поддержку IPv6 (по умолчанию отключена)
–dbpath – прямой доступ к файлам базы mongod по указанному пути, вместо конекта к серверу mongod. Необходима блокировка директории с данными, поэтому не может быть использована если монго-сервер использует базу по указнному пути
–directoryperdb – если задан аргумент dbpath, то каждая БД находится в отдельной директории
—objcheck — проверить обьект на валидность перед вставкой
—filter — использовать фильтр перед вставкой
—drop — удалить таблицу перед импортом
—indexesLast — подождать для добавления индекса (происходит быстрее, если данные вставляются не по порядку индекса)

Для восстановления c помощью mongorestore применяются подобные опции. Обычно достаточно указать БД (или не указывать) и директорию/файл с которой(го) следует произвести восстановление. Например,

mongorestore --verbose --db my_DB /tmp/backup/mongo.20110420/my_DB 

Пример скрипта для создания дампа всех БД в mongodb с помщью mongodump, их архивирования и заливки по FTP на бекап-сервер:

touch mongo_backup.sh
chmod u+x mongo_backup.sh
cat > mongo_backup.sh

#!/bin/sh
# задаем переменные, которые понадобятся в будущем для удобства
# внесения правок
DATE=`/bin/date "+%Y%m%d"`
#db="my_DB"
dump_username="root"
dump_password="password123"
dest_dir="/tmp/backup"
dump_flags="--verbose"

/bin/mkdir -p $dest_dir/mongo.$DATE

# собственно сам процесс:
/usr/local/bin/mongodump $dump_flags -o $dest_dir/mongo.$DATE

# для удобства можно настроить потабличное сжатие данных, к примеру, так
# ls -1 $dest_dir/mongo.$DATE/$db | while read TNAME
#        do
#		    echo "Archiving in database $db table $TNAME ..."
#                /usr/bin/bzip2 -z $dest_dir/mongo.$DATE/$BASE/$TNAME
#        done

cd $dest_dir && tar czvf mongo.$DATE.tgz mongo.$DATE
wput -q mongo.$DATE.tgz ftp://backup-server/backups/
/bin/rm -r $dest_dir
echo "mongo.$DATE.tgz moved to backup-server."
exit
^D 

P.S. Также существует еще пару утилит mongoimport/mongoexport, которые можно использовать для работы с данными в формате json (из: json,csv,tsv). Использование их очень похоже на mongodump/mongorestore.

Понравилась статья?
Подписаться на RSS feed
4 комментария:
  1. Гость 15 августа, 2013

    Спасибо

  2. Аноним 24 ноября, 2014

    failover, а не fileover…

  3. admin 24 ноября, 2014

    Спасибо. Исправили ошибку.

  4. hi-artem 7 июля, 2016

    wput -q mongo.$DATE.tgz ftp://backup-server/backups/
    /bin/rm -r $dest_dir

    Нет, ну так нельзя. А если wput завершиться неудачей? и не на бэкап сервере, ни здесь бэкапа не осталось.

    Я понимаю, что это скрипт «на скорую руку». но тогда лучше не удалять.

Оставить комментарий