rss Комментарии Записи
Обитель ДунКана
“Оглянись Назад!”
Я не писал здесь более 8 месяцев. Всё более-менее нормально, хотя за прошедшее время было ужасно грустное событие…
Я незнаю как скоро я осилю написать что-нибудь о кучке поездок, которые состоялись за последнее время (за 2 года, кажется).
Тем не менее - сегодня будет маленькая техническая запись. Возможно она кому-то поможет из нубов, кто будет гуглить решение организации
бекапа малой базы данных на mySQL с отправкой бекапного файла на электронную почту.

Почему выбран именно такой путь? Потому что бекап малой базы данных занимает действительно маленький объём - лично у меня порядка 300
записей в блоге в бекапном виде занимают порядка 900 Кб. Естественно всё зависит от движка сайта и т.д., тем не менее - на мой взгляд при
объёме данных с прогнозируемым ростом в течении ближайшего года до размера не более 5-8 Мб, с целью экономии средств - следует вторично
использовать имеющиеся инфраструктуры сервисов интернета, а в частности - почтовые серверы поисковых гигантов, которые обладают как
правило достаточно большой программно-аппаратной стрессоустойчивостью (в любом случае - компания, которая ищет способ построить бекап базы
данных аналогичную стрессоустойчивость позволить себе не сможет). Большинство из них имеют развитые возможности, т.е. нынче
предоставляется неограниченный объём места для почтовых сообщений и возможность настроить правила удаления писем (последнее утверждение -
не проверял).

Таким образом перед нами есть:
Цель - настроить резервное копирование малой базы данных
Ресурсы - программное обеспечение сервера на которой крутится база данных (как правило Linux, так как мы рассматриваем малую базу данных -
такие базы как правило крутятся на виртуальном хостинге провайдера, если у вас иначе - вряд ли вам имеет смысл далее читать эту статью -
вы и без того всё знаете). И возможность в качестве места хранения резервных копий использовать почтовый ящик в какой-либо почтовой
системе (для примера будет использоваться sample@gmail.com)

Что делаем - читаем инструкцию на сайте хостинг-провайдера о получении доступа к виртуальному серверу по SSH. Качаем и настраиваем putty
для этого (как правильно настройка сводится к заведение записи в putty с именем хоста на котором расположен ваш сайт, или говоря совсем по
простому - в моём случае это будет адрес моего сайта dunkanblog.ru, который будет и далее использоваться в примере). Ну и соотвественно
кликнуть SSH в используемом протоколе не забудьте.

Коннектимся к хосту.
Вводим свои логин и пароль для доступа по SSH

Из приглашения системы как правило можно узнать в какую операционную систему мы попали.

Ниже пойдёт речь о FreeBSD 6.4-RELEASE-p7, если ваш хостинг-провайдер использует другую ОС - возможно будут несущественные отличия в плане
отправки писем и прочей мелочи.

Наша задача сводится к написанию последовательности выполнения различных команд ОС для:
1) Формирование дампа базы данных
2) Сжатия дампа базы данных для уменьшения объёма отсылаемых на почтовый ящик данных
3) Формирование файла, который мы могли бы приложить к письму как attach
4) Формирование заголовка письма, чтобы мы могли быстро выбрать необходимый нам архив в случае сбоя
5) Планирование запуска данного задания с учётом его цикличности, и учитывая необходимость чистить за собой промежуточные данные.

Делал я всё постепенно, путь поиска показывать не буду, буду показывать результат:

1) Формируем файл-скрипт:
mcedit backup_dunkanblog.sh

Внутри файла располагаем следующие несколько строк:
export DBNAME=указать_имя_базы_данных DBUSER=указать_пользователя_базы_данных DBPASS=указать_пароль_базы_данных
DBPRE=префикс_базы_данных_если_есть SITE=DUNKANBLOG.RU;
mysqldump –opt -Q -u $DBPRE’_'$DBUSER -p$DBPASS –default-character-set=cp1251 $DBPRE’_'$DBNAME | gzip >
/home/имя_пользователя/backup/db_$DBNAME’_'backup’_'$(date +%Y_%m_%d).gz;
uuencode $(find /home/имя_пользователя/backup/ -name "*$DBNAME*") db_$DBNAME’_'backup’_'$(date +%Y_%m_%d).gz | mail -s "$SITE - Database
имя_пользователя_$DBNAME backup at $(date +%Y_%m_%d)" sample@gmail.com;
rm $(find /home/имя_пользователя/backup/ -name "*$DBNAME*")

Разберём, что происходит при выполнение скрипта:
1) export DBNAME=указать_имя_базы_данных DBUSER=указать_пользователя_базы_данных DBPASS=указать_пароль_базы_данных
DBPRE=префикс_базы_данных_если_есть SITE=DUNKANBLOG.RU;
Настроили переменные окружения, которые будем в последующем использовать более одного раза, дабы не повторять их и тиражировать или
изменять скрипт одним движением руки в случае необходимости. ; - означает переход к следующей команде, после успешного выполнения текущей
команды

2) mysqldump –opt -Q -u $DBPRE’_'$DBUSER -p$DBPASS –default-character-set=cp1251 $DBPRE’_'$DBNAME

запускаем утилиту создания дампа базы данных mySQL, передавая в качестве опций –opt говоря простым языком - утилита будем дописывать все
указания на создание объектов базы данный. -Q - берёт в кавычки названия таблиц и столбцов (может быть полезно в случае если у вас есть
"нюансы" в базе данных - допустим при создании таблицы вы указали её название в кавычках - в словаре (в случае oracle) название таблицы
будет хранится именно так как указано в кавычках. Внутри кавычек допустимы любые символы, вопреки нежелательности, а подчас и
невозможности, использования всех символов в названиях таблиц.
-u - имя пользователя с передачей в качестве параметра значения установленной переменной окружения
-p - и слитно, без пробела, значение переменной окружения с паролем
–default-character-set - кодировка базы данных, если отличается от той, что стоит по умолчанию
и последним параметром идёт полное имя базы данных
оператор | (вертикальная черта)- называется конвеер, и передаёт результат исполнения команды в качестве входных данных для следующей
команды

3) gzip > /home/имя_пользователя/backup/db_$DBNAME’_'backup’_'$(date +%Y_%m_%d).gz;

Мы передали команде gzip выходные данные дампа базы данных mysqldump и через оператор > перенаправили поток вывода данных в файл, указывая
его полный путь, и попутно формируя имя файла. Я формировал следующим образом: префикс, имя базы данных, постфикс в виде слова backup,
дата в формате года, месяца, дня, и указание на то, что файл сжат gzip в виде расширения файла gz Одинарные кавычки нужны для изолирования
названия переменных окружения от прочих символов. Возможно более корректно использовать двойные кавычки, окантовывая ими переменную
окружения - не вникал.

Соотвественно при успешном выполнении этой команды мы переходим на следующий шаг (;)

4) uuencode $(find /home/имя_пользователя/backup/ -name "*$DBNAME*") db_$DBNAME’_'backup’_'$(date +%Y_%m_%d).gz

uuencode преобразует двоичный файл в файл, пригодный для передачи в текстовом виде (в частности по электронной почте). Без использования
этой утилиты сделать красивый аттач к письму как я понял - не получится. Возможно ошибаюсь - настаивать не буду, а новым знаниям буду рад.

find /home/dunkanb5/backup/ -name "*$DBNAME*" — ищем сформированный в предыдущем шаге файл и его полный путь, передавая это в качестве
первого параметра команды.

И вторым параметром идёт выходное имя файла.

Так как uuencode результат выполнения выводит на стандартный выход - перенаправляем с помощью конвеера эти данные на вход следующей
программы.

5) mail -s "$SITE - Database имя_пользователя_$DBNAME backup at $(date +%Y_%m_%d)" sample@gmail.com;

формируем тему письма ключло -s и в качестве второго параметра передаём адрес электронной почты на которое необходимо отослать письмо.

6) rm $(find /home/имя_пользователя/backup/ -name "*$DBNAME*")
В случае успешного выполнения предыдущей команды выполняем удаление за собой бекапного файла.

Окей, допустим скриптик мы создали, позапускали его через консоль ручками и убедились, что через несколько минут к нам приходит письмо с
бекапом базы. Отлично, отладили все ошибочки. Теперь надо добавить его в планировщик заданий.

Создаём файл из которой передадим потом крону.
mcedit back.crn
следующего вида:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/bin:/usr/local/bin
HOME=/home/имя_пользователя
0 5 1 * 1 ./backup_dunkanblog.sh

Первые три строки - настройка переменного окружения.
Крайняя строка - настройка исполнения созданного нами скрипта по расписанию. В моём случае расписание такого - каждый первый день недели и
каждое первое число месяца в 5:00 каждого месяца выполнять ./backup_dunkanblog.sh

Более подробно о настройке крона не представляет никакого труда нагуглить, поэтому описывать не буду.

Вот и всё - наслаждаемся спокойно приходящими бекапами базы.

  

Пока никто не комментировал.



Или используйте OpenID:

wp guru