Самое главное в администрировании - иметь свежий бэкап критически важных данных. Даже если у вас RAID массив с кучей HDD и сервер с информацией находится в подземном бункере с защитой от прямого попадания ядерной бомбы - даже это не защитит файлы от банального удаления их самим пользователем. Сегодня будем писать скрипт на BASH для резервного копирования файлового сервера.
Логика работы скрипта:
1) При запуске скрипта проверяется существование папки, которую необходимо бэкапить и если эта папка отсутствует, то скрипт завершает свою работу с указанием ошибки.
2) Проверяется существование папки, в которую следует складывать бэкапы, если не существует, то создаются все папки для существования пути, указанного в переменной SAVE_DIR_BACKUP
3) Определяются переменные и выводится информация.
4) Проверяется существование файла- метки последнего бэкапа, если не существует - создается с текущей датой запуска скрипта.
5) Файлы бэкапа каждого месяца скрипт складывает в отдельную папку. Проверяется наличие папки текущего месяца, если не существует - создается.
6) Каждый первый запуск в новом месяце скрипт создает полный бэкап папки DIRTOBACKUP1
Если файл полного бэкапа месяца существует :
а) Если файл-метка не содержит запись ""FULL_ERROR", то создается список изменившихся файлов с даты последнего изменения файла-метки и создается бэкап изменившихся файлов.
б) Если файл-метка содержит запись ""FULL_ERROR", значит по каким-то причинам файл полного бэкапа не смог полностью создаться (выключили сервер в момент создания бэкапа?) . В файл-метку пишется статус FULL_ERROR на случай, если процесс создания файла полного бэкапа не сможет завершиться успешно и создается полный бэкап. После создания бэкапа в файл-метку пишется текущая дата создания бэкапа (т.е. полный бэкап создался успешно).
Если файл полного бэкапа месяца не существует:
а) В файл-метку записывается статус "FULL_ERROR" для ситуации, если процесс создания полного бэкапа будет прерван. Создается файл полного бэкапа. В файл-метку записывается текущая дата создания бэкапа.
7) Завершение работы скрипта.
#!/bin/bash
export PATH=/bin:/usr/bin: echo echo -e "e[01;31m------------------------------------------------------e[00m"
echo -e "e[01;31m *** FILE BACKUP SCRIPT STARTED ***e[00m" echo -e "e[01;31m------------------------------------------------------e[00m"#---------------------------------- # Что будем бэкапить (Путь к папке)
DIRTOBACKUP1=/home/PROJECTS# Куда складывать бэкапы
SAVE_DIR_BACKUP=/home/BACKUP/PROJECTS#------------------------------ # Проверяем входящие переменные #------------------------------
if [ -d $DIRTOBACKUP1 ]; then echo -e "e[01;32m Папка, которую необходимо бэкапить: существует.e[00m" else echo -e "e[01;31m Папка, которую необходимо бэкапить: не существует.e[00m" echo -e "e[01;31m Продолжение выполнения скрипта невозможно.e[00m" exit 1 fi if [ -d $SAVE_DIR_BACKUP ]; then echo -e "e[01;32m Папка, для хранения бэкапов: существует.e[00m" else echo -e "e[01;31m Папка, для хранения бэкапов: не существует.e[00m" echo -e "e[01;31m Создаем...e[00m" mkdir -p --verbose $SAVE_DIR_BACKUP fi#----------------------------------- # Общие переменные для папки бэкапов #----------------------------------- # Текущий год и месяц в формате YYYY-MM
YEAR_MONTH=`date '+%Y-%m'`# Полный путь к папке бэкапов текущего месяца
FULL_BACKUP_FOLDER_NAME="${SAVE_DIR_BACKUP}/${YEAR_MONTH}/"#---------------- # ПОЛНЫЙ БЭКАП #---------------- # Имя файла полного бэкапа
FULL_BACKUP_FILE="full_backup_$YEAR_MONTH"# Полный путь файла полного бэкапа
FULL_BACKUP_FOLDER_FILE="${FULL_BACKUP_FOLDER_NAME}${FULL_BACKUP_FILE}.tar.gz"#--------------------- # ИНКРЕМЕНТНЫЙ БЭКАП #--------------------- # Метка последнего выполнения бэкапа # для записи в файл lasttimebackup.log #LAST_LABEL=`date '+%Y-%m-%d %H:%M:%S'` # Файл с меткой последнего бэкапа
LAST="${SAVE_DIR_BACKUP}/lasttimebackup.log"# Файл, в который будем записывать списог изменившихся файлов
LAST_FILE_MODIFED="${SAVE_DIR_BACKUP}/files_chaneged.log"# Заготовка для имени файла инкрементного бэкапа (формат YYYY-MM-DD)
YEAR_MONTH_DAY=`date '+%Y-%m-%d'`# Полный путь файла инкрементного бэкапа
INCREMENT_FOLDER_FILE="${FULL_BACKUP_FOLDER_NAME}${YEAR_MONTH_DAY}.tar.gz"# Определяем свободное место на диске
freehd=`df -m | grep "/dev/md1" | awk '{print $4}'` freehdmb=`expr $freehd / 1024` echo " Свободное место на диске: $freehdmb GB" echo "-------------------------------------------------" echo " Текущая дата: $YEAR_MONTH_DAY" echo " Имя папки, которую будем бэкапить: $DIRTOBACKUP1" echo " Сохраняем бэкапы в: $SAVE_DIR_BACKUP"#echo " Имя папки для бэкапа: $YEAR_MONTH"
echo " Полный путь к папке бэкапа текущего месяца: $FULL_BACKUP_FOLDER_NAME"#echo " Полный путь файла полного бэкапа: $FULL_BACKUP_FOLDER_FILE" #echo " Полный путь файла инкрементного бэкапа: $INCREMENT_FOLDER_FILE"
echo "-------------------------------------------------"#------------------------------------------------------------------------- # Проверяем существование файла метки последнего бэкапа, если нет - создаем #--------------------------------------------------------------------------
if [ -f $LAST ]; then echo " Файл метки последнего бэкапа существует" else echo " Файл метки последнего бэкапа не существует - создаем c текущей датой" echo $YEAR_MONTH_DAY > $LAST fi# Проверяем существование папки для текущего месяца
if [ -d $FULL_BACKUP_FOLDER_NAME ]; then echo " Папака текущего месяца для бэкапа существует" else echo " Папка текущего месяца для бэкапа не существует - создаем..." mkdir $FULL_BACKUP_FOLDER_NAME fi# Считываем в переменную содержимое файла
ERR_CHK=$(cat $LAST) echo "Последний бэкап завершился со статусом: $ERR_CHK"#---------------------------------------- # Если файл полного бэкапа существует #----------------------------------------
if [ -f $FULL_BACKUP_FOLDER_FILE ]; then if [ $ERR_CHK != "FULL_ERROR" ]; then# Файл полного бэкапа существует и не было ошибок при его создании # Будем делать инкрементный бэкап
echo " Ошибки создания файла полного бэкапа не было" echo " Файл полного бэкапа существует - делаем инкрементный бэкап"# Ищем файлы старше даты модификации файла $LAST
find $DIRTOBACKUP1 -newer $LAST -type f -print > $LAST_FILE_MODIFED TAR_PARAM="-T $LAST_FILE_MODIFED" SAVENAME="$INCREMENT_FOLDER_FILE" else# Записываем статус ошибки в файл
echo FULL_ERROR>$LAST echo " Последнее создание полного бэкапа произошло с ошибкой" echo " Повторно делаем полный бэкап" TAR_PARAM="$DIRTOBACKUP1" SAVENAME="$FULL_BACKUP_FOLDER_FILE" fi else# Записываем статус ошибки в файл
echo FULL_ERROR>$LAST echo " Файл полного бэкапа не существует - делаем полный бэкап" TAR_PARAM="$DIRTOBACKUP1" SAVENAME="$FULL_BACKUP_FOLDER_FILE" fi echo -e " Команда запуска: e[01;32m tar cpzfv ${SAVENAME} ${TAR_PARAM}e[00m" tar cpzfv ${SAVENAME} ${TAR_PARAM}# Если все прошло нормально, сбрасываем статус ошибки
echo $YEAR_MONTH_DAY > $LAST exit 0
Источник: Day > /dev/null: Ubuntu Server 10.04 - делаем бэкапы при помощи BASH скрипта.: