понедельник, 18 июня 2012 г.

Ubuntu Server 10.04 - делаем бэкапы при помощи BASH скрипта.


    Самое главное в администрировании - иметь свежий бэкап критически важных данных. Даже если у вас RAID массив с кучей HDD и сервер с информацией находится в подземном бункере с защитой от прямого попадания ядерной бомбы - даже это не защитит файлы от банального удаления их самим пользователем.  Сегодня будем писать скрипт на BASH  для резервного копирования файлового сервера.




    Логика работы скрипта:
1) При запуске скрипта проверяется существование папки, которую необходимо бэкапить и если эта папка отсутствует, то скрипт завершает свою работу с указанием ошибки.
2) Проверяется существование папки, в которую следует складывать бэкапы, если не существует, то создаются все папки для существования пути, указанного в переменной SAVE_DIR_BACKUP.
3) Определяются переменные и выводится информация.
4) Проверяется существование файла- метки последнего бэкапа, если не существует - создается с текущей датой запуска скрипта.
 5) Файлы бэкапа каждого месяца скрипт складывает в отдельную папку. Проверяется наличие папки текущего месяца, если не  существует - создается.
 6) Каждый первый запуск в новом месяце скрипт создает полный бэкап папки DIRTOBACKUP1. 
    Если файл полного бэкапа месяца существует :
    а)  Если файл-метка не содержит запись "FULL_ERROR", то создается список изменившихся файлов с даты последнего изменения файла-метки и создается бэкап изменившихся файлов.
   б)  Если файл-метка содержит запись "FULL_ERROR", значит по каким-то причинам файл полного бэкапа не смог полностью создаться (выключили сервер в момент создания бэкапа?) . В файл-метку пишется статус FULL_ERROR на случай, если процесс создания файла полного бэкапа не сможет завершиться успешно и создается полный бэкап. После создания бэкапа в файл-метку пишется текущая дата создания бэкапа (т.е. полный бэкап создался успешно).
  Если файл полного бэкапа месяца не существует:
  а) В файл-метку записывается статус  "FULL_ERROR" для ситуации, если процесс создания полного бэкапа будет прерван. Создается файл полного бэкапа. В файл-метку записывается текущая дата создания бэкапа.
7) Завершение работы скрипта.



#!/bin/bash
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





Комментариев нет:

Отправить комментарий