Простой универсальный скрипт для снятия бекапов с ненагруженных баз данных и сохранения файлов.

На примере базы и файлов wordpress.
Решаемая скриптом задача: снимать раз в три дня бекап бд, хранить — тридцать дней => в кроне периодичность 3 дня для запуска скрипта. Для экономии места и удобства архивировать снятые бекапы. Так же бекапировать файлы самого wp, их хранить будем вечно.


Для снятия бекапов с БД используем mysqldump — утилита, необходимая для снятия бекапов с базы mysql. Утилита блокирует запись в таблицы, снимает в единый файл дамп базы и разблокирует базу обратно. Таким образом удается избежать ошибок при сценарии «Я скопировал файлы базы, а в это время некоторые таблицы были перезаписаны и в итоге у меня есть нерабочий, но успокаивающий нервы бекап».
Синтаксис:
mysqldump -options database_name
В случае с конкретным скриптом мы используем -u — имя пользователя, под которым будет сниматься бекап; -p — пароль для пользователя; и, самое интересное, -h — хост целевой базы. Эта опция нужна, когда скрипт бекапа запускается с удаленной по отношению к базе машины и позволяет указать ее адрес. По умолчанию (при отсутствии отдельного указания), за host принимается localhost.

Для бекапирования файлов вп используем утилиту rsync. Она позволяет осуществлять инкрементальный бекап (сравнивает, не изменились ли файлы и при наличии изменений синхронизирует запись).
Синтаксис:
rsync <-options>
Наиболее полезные опции:
-v – подробный режим;
-r – копировать данные рекурсивно (но без сохранения инфомрации о времени изменения файлов и правах доступа);
-a – режим архивирования, позволяет копировать данные рекурсивно с сохранением симлинков, правах доступа на файлы/каталоги и другую информацию);
-z – сжатие данные;
-h – вывод данных в human-readable формате.

При синхронизации данных с удаленной машины, адрес источника записывается как пользователь@адрес_машины:адрес_источника

Сначала требуется создать пользователя для подключения к БД. Подробно на этом останавливаться не будем, так как это будет рассмотрено в одной из следующих статей.


#!/bin/bash
DATE=`date +"%d-%m-%Y"` // для удобства ориентирования в бекапах
HOST=remote_machine_address // адрес машины, где лежит бекапируемая база
FILES=files_address // адрес на удаленной машине, где лежат бекапируемые файлы
DB=dbname // имя базы
BDIRBD=db_backup_address // сюда складываем бекап базы
BDIRF=db_files_address // сюда - бекап файлов
RENAME=dbname // для удобства ориентирования в бекапах
USER=backup // пользователь c правами, достаточными для бекапа
RUSER=rsync_backup // пользователь для подключения с rsync
PASS=very_secret_password // пароль к пользователю
N=+30 // глубина хранения бекапа

mysqldump -h $HOST -u $USER -p$PASS $DB | gzip >$BDIRBD/$RENAME.$DATE.gz // первую половину команды рассмотрели уже выше
//
| передает результат утилиты слева в утилиту справа, то есть
// файл от mysqldump передается в утилиту gzip
// > значит, что результат gzip будет записан в файл с указанным далее именем
rsync -az $USER@$HOST:$FILES $BDIRF // копируем файлы с удаленной машины
find $BDIRBD -type f -mtime $N -exec rm {} \; // находим в директории с бекапами БД файлы старше указанной в переменной и через exec передаем в команду удаления файлов

Интересный момент связан с авторизацией в rsync — он способен авторизовываться как по паролю из файла, так и по ключу. Для авторизации по ключу ему необходимо быть запущенным как демон, что не очень выгодно с точки зрения экономии ресурсов. Второй вариант — авторизация по ключу.
Подробно на настройке авторизации по ключу останавливаться не будем.
После настройки авторизации по ключу необходимо прогнать скрипт единожды для подтверждения доверия ключу.