Резервное копирование всех баз данных Mysql одной командой в Debian
Данную статью поймёт не всякий, но профессионалам будет интересно! Всем, кому понравится данный материал, рекомендуется к прочтению моя статья про резервное копирование всех сайтов с консоли.

Резервное копирование, вещь лишняя и ненужная до того момента когда
В общем, там еще остается куча нерешенных вопросов, например, как ограничить количество бэкапов и по какому критерию. Обложившись маннами и здравым смыслом, в результате раздутый скрипт достиг 30 строк, после чего пришлось его сокращать.
В итоге получился такой вариант:
Создаем папку с форматом, например, /var/backup/mysql/2012-12-3/, где последние цифры — это цифровое выражение дня недели (%u). И вуаля — все строчки кода превратились в компактный скрипт. По пути пришлось отказаться от потокового сжатия, так как его минусы оказались значительными: слишком много проблем, первая ошибка останавливает скрипт полностью, хоть он и логируется в файл, что недопустимо. Даже если один дамп не сработал, остальные должны выполниться корректно. Плюс сделана удобная каталогизация.
mkdir /var/backup/mysql/`date +%Y-%m-%u` >> /dev/null 2>&1
for i in `mysql -uroot -pпароль -e 'show databases;' | grep -v information_schema | grep -v Database`; do
mysqldump -uroot -pпароль $i > /var/backup/mysql/`date +%Y-%m-%u`/$i.sql
done >> /dev/null 2>> /var/log/sqlbackup.log
Однако и от этого варианта пришлось отказаться — слишком сложно и громоздко. Нам нужен 100% работающий скрипт, который невозможно повредить.
Итак, упрощаем. С этого момента можно сразу запускать в консоли:
vim /bin/sqlbackup
chmod 700 /bin/sqlbackup
И вставляем следующий скрипт:
#!/bin/sh
##############################
# Скрипт бэкапа баз данных
##############################
# Создаем папки для архивов (-p не ругается, если папка уже есть)
test ! -d /var/backup/mysql/`date +%Y` && mkdir -p /var/backup/mysql/`date +%Y`
test ! -d /var/backup/mysql/last && mkdir -p /var/backup/mysql/last
# Скрываем папки от посторонних (права 700)
chmod 700 /var/backup/mysql
chmod 700 /var/backup/mysql/last
#v/null 2>&1
- здесь ваш пароль
# Создаем дампы баз, свежие файлы всегда лежат в папке last, что удобно — не нужно лазить в архивы.
for i in mysql -uroot -p********** -e 'show databases;' | grep -v information_schema | grep -v performance_schema | grep -v Database; do
mysqldump -uroot -p********** $i > /var/backup/mysql/last/$i.sql
done >> /dev/null 2>> /var/log/sqlbackup.log
# Архивируем дампы и логируем
cd /var/backup/mysql/
tar -cjvf /var/backup/mysql/`date +%Y`/sqldump-`date +%Y-%m-%u`.tar.bz2 ./last >> /dev/null 2>> /var/log/sqlbackup.log
# Конец скрипта
Запускаем из консоли:
sqlbackup
Для уменьшения нагрузки на рабочий сервер:
nice -19 sqlbackup
Добавляем в cron для ежедневного запуска в 4:00 утра:
crontab -e
Вставляем строку:
00 4 * * * nice -19 /bin/sqlbackup >/dev/null 2>> /var/log/cron.log
Теперь каждое утро в 4:00 будет делаться бэкап. По умолчанию свежие дампы лежат в папке last, а архивы — в папке соответствующего года.
В итоге за год будет создано около 12×7 бэкапов.
На первый взгляд кажется много, но текстовые файлы хорошо сжимаются — все базы сжались до примерно 400 МБ. То есть 84 бэкапа по 400 МБ — всего около 40 ГБ, что очень мало на фоне 2 ТБ дискового пространства. При этом вы получаете резервные копии каждой последней недели каждого месяца и всегда свежий бэкап в папке last.
Можно усложнить скрипт, добавив автоматическое удаление старых бэкапов и сохранение, например, только одного среза позапрошлого года. Но это уже по желанию. На текущий момент скрипт делает срез и архивирует его, а дальше уже можно настроить крон на любые нужные задачи.
Оставить комментарий
Комментарии (2)