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

Posted on 08/13/2010 by   |   Filed under templates, internet    Comments 11

Самое главное в администрировании - иметь свежий бэкап критически важных данных. Даже если у вас 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 скрипта.:

Image Gallery

Services Overview

Curabitur sed urna id nunc pulvinar semper. Nunc sit amet tortor sit amet lacus sagittis posuere cursus vitae nunc.Etiam venenatis, turpis at eleifend porta, nisl nulla bibendum justo.

Contact Us

Nullam quam lorem, tristique non vestibulum nec, consectetur in risus. Aliquam a quam vel leo gravida gravida eu porttitor dui.

Address: 1458 TemplateAccess, USA
Telephone: +123-1234-5678
FAX: +458-4578
Others: +301 - 0125 - 01258
E-mail: mail@yoursitename.com