Скрипт automysqlbackup для автоматизации резервного копирования

В дополнение к материалу, "Резервное копирование и восстановление баз данных с помощью программы Mysqldump", хотелось-бы рассказать о довольно простом и достаточно удобном средстве для автоматизации процесса, ежедневного, еженедельного и ежемесячного резервного копирования баз данных MySQL. Это обычный shell-скрипт, Automysqlbackup.sh, использующий для работы, программу mysqldump.

Последняя версия скрипта доступна тут: ]]>sourceforge.net]]>.

Все необходимые переменные для настройки работы, прописаны в самом скрипте. Итак, настроим автоматическое резервное копирование.

USERNAME=dbadmin
Имя пользователя, для подключения к MySQL серверу.
PASSWORD=dbadminpass
Пароль пользователя.
DBHOST=localhost
Имя сервера. Можно использовать как доменное имя, так и IP адрес.
DBNAMES="all"
Список баз данных, для которых необходимо создавать резервные копии. Перечисляются через пробел. Если пробел присутствует в имени базы данных, здесь его необходимо прописать, заменив пробел символом %. Для этой переменной можно использовать ключевое слово All, для резервного копирования всех баз данных, данного хоста. При установке значения all, будут создаваться резервные копии, всех имеющихся и создаваемых баз данных, без изменения настроек данного скрипта. То есть, если в процессе работы, вы создадите еще несколько баз данных, они автоматически будут включены в резервное копирование. В данном случае, мы будем делать резервную копию всех баз, находящихся в рамках localhost.
BACKUPDIR="/backup/db"
Директория, где будут храниться резервные копии баз данных
MAILCONTENT="log"
Что отправлять по почте. Имеет следующие возможные значения: log - отправлять только отчет о проделанной работе; files - отправлять отчет и файлы резервных копий в аттаче письма; stdout - при запуске вручную, выводить отчет на экран; quiet - отправлять отчет только в случае возникновения ошибок;
MAXATTSIZE="1000"
Максимальный размер аттача в письме, высылаемом скриптом, в килобайтах
MAILADDR="почтовый@адрес"
Один или более, через пробел, адрес электронной почты.
MDBNAMES="mysql $DBNAMES"
Базы данных для ежемесячного резервного копирования. Как видите сюда добавлена системная база данных mysql в которой хранятся, например, имена и пароли пользователей, плюс все базы данных, перечисленные выше, в переменной DBNAMES.
DBEXCLUDE=""
Если переменная DBNAMES, установлена в значение "all", с помощью данной переменной, можно исключить необходимые базы из резервного копирования.
CREATE_DATABASE=yes
Добавляет в дамп соответствующий оператор. При восстановлении из резервной копии, создаются базы данных с исходными именами. Если установить значение, "no", при восстановлении, нужно будет вручную указать имя базы данных, в которую следует развернуть резервную копию. Не используется при SEPDIR=no
SEPDIR=yes
Использовать раздельные директории и файлы для каждой базы данных. Если установить значение, no, все базы будут сохранены в один большой дамп, что довольно удобно, например, при необходимости восстановить весь сервер. В нашем случае, каждая база будет сохранена в отдельный дамп, и восстанавливать нужно будет каждую в отдельности.
DOWEEKLY=6
В какой день недели, делать еженедельную резервную копию. 1 - Понедельник.
COMP=gzip
Тип сжатия. Возможные варианты: gzip и bzip2. bzip2, сжимает лучше, но при работе потребляет больше ресурсов.
COMMCOMP=no
Сжимать трафик между клиентом и сервером. Полезно при резервном копировании с удаленного сервера.
LATEST=yes
Сохранять дополнительные копии последнего дампа в отдельную директорию.
MAX_ALLOWED_PACKET=
Если в базе данных, используются большие поля типа BLOB, можно установить необходимый размер пакета.
SOCKET=/tmp/mysql.sock
Путь до файла сокета, если используется.
#PREBACKUP="/etc/mysql-backup-pre"
Выполнять определенные действия перед началом резервного копирования. Например выдавать в консоль сообщение типа "Starting backup".
#POSTBACKUP="/etc/mysql-backup-post"
То-же, что и предыдущая переменная, только выполнять действие, после завершения резервного копирования.

Как видите все очень просто. Для проверки правильности настроек, можете установить переменную MAILCONTENT="stdout" и запустить скрипт вручную, из командной строки. После завершения резервного копирования, будет выведен отчет о проделанных действиях. Теперь можно поместить запуск automysqlbackup.sh в расписание демона cron, файл /etc/crontab, следующей строкой:

0      3      *       *       *       root    /usr/local/scripts/automysqlbackup.sh

При такой настройке, automysqlbackup.sh, будет запускаться ежедневно в 3 часа ночи.

Восстановление из резервной копии, производится как обычно, с использованием утилиты mysql, естественно предварительно распаковав файл дампа из архива. Например:

vds-admin$/backup/db/daily/drupal/ gunzip drupal_20090811_11h54m.Tuesday.sql.gz

Получим файл резервной копии drupal_20090811_11h54m.Tuesday.sql. Теперь восстанавливаем:

vds-admin$/ mysql -u dbadmin -pdbadminpass database < /backup/db/daily/drupal/drupal_20090811_11h54m.Tuesday.sql
Небольшое замечание. Данный скрипт не производит ротацию ежемесячных резервных копий, то есть каждая новая копия, затирает предыдущую. Если вас это не устраивает по каким-то причинам, например вам нужно хранить резервные копии всех месяцев, можете дописать скрипт, или копировать файлы ежемесячных дампов через тот-же cron, ну или вообще вручную.

Удачи

Комментарии

Спасибо!

"копирования баз данных NySQL."

MySQL? Опечатка.

поправил, спасибо)

Спасибо за подробную информацию!

Спасибо, давно искал исчерпывающую информацию и нашел у вас.

На мой взгляд проще делать дамп самой папки с бд, и легче и быстрей и востанавливать не надо 200 баз, береш базу береш таблицу швырнул наместо, релоад и ок ;)

cd /var/backup/SQl_backup/
tar -cvjf /var/backup/SQl_backup/den_nedeli_`date +%u`.tar.bz2 /var/lib/mysql

Добавляем в крон ;) наслождаемся 7 бэкапов по дню недели, месяцы годы по аналогии.

на нагруженных проектах рискуете потерять данные

каким образом ? в 99% случаев интернет проектов подавляющая часть запросов к бд идет на чтение запись прктически не используется. Если же мы говрим о полноразмерном кластере, репликации баз данных, разведения пост и гет на разные сервера то тут вообще все будет по друному.
Уточните пожалуйста ваше выскзывание

Пардон видимо очень старый пост.
Да действительно копирование полностью базы данных совершенно не подходит. Если майсам еще както понимает этот юмор, то инодб валится сразу же.
Лучший вариант
#скрипт бэкапа баз данных
###########################
#Создаем папку для архивов. -p не ругается когда папка уже есь test проверяет есть ли папка для чистых логов
test ! -d /var/backup/mysql/`date +%Y` &test ! -d /var/backup/mysql/last &#прячем от умных, и так не зайдут но всеже.
chmod 600 /var/backup/mysql
chmod 600 /var/backup/mysql/last

# делаем сам дапм файлов sql, свежинькие файлы лежат всегда в ней, очень удобно не нужно заходить в архивы и искать там вчерашние базы, и логируется.
for i in `mysql -uroot -pпарольбдслитносатрибутом -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -uroot -pDungeonKeeper $i > /var/backup/mysql/last/$i.sql;done >> /dev/null 2>> /var/log/sqlbackup.log
# Архивируем дамп, ну и логируем разумеется
cd /var/backup/mysql/
tar -zcvpf /var/backup/mysql/`date +%Y`/sqldump-`date +%Y-%m-%u`.tar.bz2 ./last >> /dev/nool >> /var/log/sqlbackup.log

Спасибо большое!

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

Содержание этого поля является приватным и не предназначено к показу.
Регистр имеет значение
  .ooooo.                 oooooooo  oooo    oooooooooooo              
d88' `8. dP""""""" `888 d'""""""d888'
Y88.. .8' .ooooo. d88888b. 888 .888P oooo ooo
`88888b. d88' `88b `Y88b 888 d888' `88. .8'
.8' ``88b 888ooo888 ]88 888 .888P `88..8'
`8. .88P 888 .o o. .88P 888 d888' .P `888'
`boood8' `Y8bod8P' `8bd88P' o888o .8888888888P .8'
.o..P'
`Y8P'
Введите код, изображенный в стиле ASCII-арт.