Резервное копирование всех баз данных 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)

  1. SiteMaster 24.02.2019 Ответить
    В логи сыплет ненужное:
    mysqldump: Got error: 1142: "SELECT, LOCK TABLES command denied to user 'root'@'localhost' for table 'accounts'" when using LOCK TABLES
    Или добавить параметр -skip-add-locks к команде mysqldump
    Или grep-нуть performance_schema, которая для восстановления пользовательских баз не нужна. Если все таки нужна то она дампится очень быстро, можно, отдельно с остановкой сервиса, отдельным скриптом.
    Или дописать ключи --ignore-database=performance_schema --ignore-database=information_schema к команде mysqldump
    За скрипт огромное спасибо, простенько и со вкусом.
    В заголовке скрипта не хватает #!/bin/bash
    В Debian папка для бэкапов называется Backups

  2. Виктор
    Виктор 25.02.2019 Ответить
    Очень приятно что даже столь старые статьи читают.
    performance_sche в 12 году насколько я помню еще не было ;) но да все ваши замечания вполне актуальны.
    Специально для вас, немного освежил скрипт, убрал неверные коды завершения и подобные мелочи.
    Возможно, вам будет интересно и это
    https://klondike-studio.ru/blog/rezervnoe-kopirovanie-etc/?clear_cache=Y