Простой скрипт бэкапа во FreeBSD


Автор Охальников Олег

Резервирование поделю на два вида - это повышение надежности с помощью RAID массивов и избыточное резервирование. Отмечу, что оба подхода должны применяться на ВАЖНЫХ серверах (в лучшем случае - на любых серверах). RAID, например 1 - зеркало, спасет от отказа одного из HDD, если файл сервер с большим количество HDD, то желательнее применять или RAID 10 или RAID 6 (за подробностями в википедию). Т.е. за короткий срок извлекаем поврежденный HDD, вставляем новый синхронизируем и продолжаем работать, наличие HotSwap корзин в данном случае очень желательно. От чего не спасет RAID, так это от человеческого фактора. Например взяли и удалили файл, спохватились, а его уже нет или повредили данные и т.д. Для этого необходима система избыточного резервирования важной информации, на сервере в основном это конфигурационные файлы, базы данных MySQL. В итоге имеем, как минимум 3 HDD, из двух собираем RAID1 (зеркало) и ОТДЕЛЬНЫЙ HDD - под бэкапы важных файлов. Конечно, это не обязательно, это лишь моя точка зрения, моё мнение.
Сам скрипт бэкапа backup.sh не сложный, выглядит следующим образом:


# -----------------------------------
# Created Ohalnikov Oleg
# Support: http://unixa.ru
# -----------------------------------

#!/bin/sh

DIR=/mnt/backup
DATA=`date '+%Y%m%d'`

cd $DIR
mysqldump -u root --password='*****' -l --all-databases | gzip > databases-$DATA.sql.gz
tar -czf named-$DATA.tar.gz /var/named
tar -czf log-$DATA.tar.gz /var/log
tar -czf etc-$DATA.tar.gz /etc
tar -czf locetc-$DATA.tar.gz /usr/local/etc
tar -czf www-$DATA.tar.gz /usr/local/www

for file in *-$DATA.*
do
echo "$file" >> $DIR/current
done
echo "Backup Server $DATA" | mail -s "Backup Server $DATA" administrator@mailserver.ru < $DIR/current
rm -f $DIR/current

find $DIR/* -mtime +7 -exec rm {} ;

# <<< THE-END >>>


Все длинные команды mysqldump и mail должны быть написаны в одну строку.
DIR - директория с бэкапами.
DATA - текущая дата в формате ГОДМЕСЯЦДЕНЬ.
Далее по скрипту переходим в директорию с бэкапами (cd $DIR) и выполняем последовательно команды архивирующии все базы данных mysqldump ключ --all-databass , -l - лочит базы на время выполнения дампа, ключ --password='*****' - вместо звездочек указываем пароль, т.к. он в открытом виде, права на файл backup.sh делаем 700, т.е. чтение, редактирование и исполнение - только root пользователю. Далее сжимаем полученный дамп gzip (должен присутствовать в системе) и перенаправляем в файл databases-$DATA.sql.gz. Далее идут команды tar -czf, которыми создаем архивы нужных директорий (можете включать любые свои). На этом собственно сам скрипт, который выполняет бекапы заканчивается, следующая секция для удобства или точнее для контроля выполнения архивирования. Т.е. после удачно выполненного скрипта, смотрим появились ли в директории файлы в имени которого числится текущая дата, если такие файлы есть - записываем их в файл current, который считываем в тело письма и отправляем на мыло администратору, далее удаляем временный файл current, т.е. вот эта секция:


do
echo "$file" >> $DIR/current
done
echo "Backup Server $DATA" | mail -s "Backup Server $DATA" administrator@mailserver.ru < $DIR/current
rm -f $DIR/current


Ну и последняя команда:

find $DIR/* -mtime +7 -exec rm {} ;


т.е. храним файлы архивов в /mnt/backup - 7 дней.

Чтобы бекап выполнялся каждый день в 00:05, добавляем задание в кронтаб #crontab -e:

# Backup
5 0 * * * /root/script/backup.sh


ВНИМАНИЕ! #crontab -e - это файл заданий root пользователя. Часто можно видеть темы, в которых говорится примерно следующее: "Добавляю команды в кронтаб, а они не выполняются" или "Добавляю скрипт в кронтаб, а он не выполняется, хотя из консоли ./backup.sh выполняется нормально". Все дело в том, что надо в #crontab -e прописать переменные окружения, т.е. добавить следующие строки в самый верх файла:

SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin
MAILTO= administrator@mailserver.ru


После чего команды в скриптах могут быть написаны в сокращенном виде. Если этих строк нет, то команды надо писать полностью, например не mysqldump ...... , а /usr/local/bin/mysqldump, что не совсем удобно. Я в кронтаб добавляю строку MAILTO=, т.е. все ошибки при исполнении скрипта по крону, падают мне на мыло.

Обновлено: 12.03.2015