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