вторник, 4 августа 2015 г.

Инкрементное резервное копирование данных с помощью rdiff-backup


Перепробовав решения под Windows, как бесплатные, так и платный Acronis Backup and Recovery, купленный на эти цели за "дорого для такой глючной программы", и уже было отчаявшись в поисках - решил попробовать бесплатные решения на Linux.
Из-за своей простоты, качества и скорости - выбор был сделан в пользу rdiff-backup.
Итак посмотрим, как сделать полноценный сервер резервирования данных на основе Rdiff (как обычно на Debian 8.0)

1)Установка
Т.к. Rdiff - идет в стандартных репозиториях, то тут ничего сложного нет:
apt-get -q -y install rdiff-backup
Все, программа готова к работе, вот так вот просто.

2) Синтаксис
Как и со всеми Linux-way дистрибутивами, работа с rdiff-backup очень и очень простая.
Для того чтобы сделать копию нужного каталога достаточно набрать:
rdiff-backup /data_path /destination_path
После чего в папке destination_path будет создана инкрементная копия data_path. Если после данного копирования вы измените состав или содержимое файлов в data_path и заново выполните копирование - скопируются только измененные файлы.
Чтобы посмотреть все доступные инкрементные данные поданной папке достаточно набрать:
rdiff-backup -l /destination_path
Вывод данной команды будет примерно вот такой:
Found 5 increments:
increments.2014-07-14T21:51:05+06:00.dir   Sat Jul 14 21:51:05 2014
increments.2014-07-15T21:51:03+06:00.dir   Sun Jul 15 21:51:03 2014
increments.2014-07-15T22:02:30+06:00.dir   Sun Jul 15 22:02:30 2014
increments.2014-07-16T21:51:08+06:00.dir   Mon Jul 16 21:51:08 2014
increments.2014-07-19T21:51:08+06:00.dir   Thu Jul 19 21:51:08 2014

Current mirror: Sat Aug 25 01:25:01 2014
Здесь мы видим 5 слепков данной дериктории, датированные 14-19 июля. Это значит, что в данные дни были выполнены какие-то изменения в data_path.

3) Восстановление данных
Чтобы восстановить данные за какой-то определенный день необходимо набрать:
rdiff-backup -r 2014-07-19T21:51:08+06:00 /destination_path/some_file_or_dir /local_dir
Разберем команду:
2014-07-19T21:51:08+06:00 - я взял из предыдущего вывода (последний инкремент). Программа поддерживает не только такое представление, чтобы восстановить данные 5-ти дневной давности можно набрать 5D, 2-х недельной 2W и так далее.
/destination_path/some_file_or_dir - можно указать конкретный файл из сохраненных данных, либо дирикторию полностью.
/local_dir - здесь нужно указать в какую директорию выполнить восстановление данных.

4) Диагностика
По умолчанию, после запуска, rdiff-backup ведет себя более чем скромно, и сообщает только если сталкивается с какими-либо ошибками при копировании.
Для повышения уровня дебага есть встроенная опция '-v' или '--verbosity', уровень можно регулировать от 0 до 9.
rdiff-backup -v 4 /tmp /backup
Using rdiff-backup version 1.2.8
Unable to import win32security module. Windows ACLs
not supported by filesystem at /tmp
escape_dos_devices not required by filesystem at /tmp
-----------------------------------------------------------------
Detected abilities for source (read only) file system:
  Access control lists                         On
  Extended attributes                          On
  Windows access control lists                 Off
  Case sensitivity                             On
  Escape DOS devices                           Off
  Escape trailing spaces                       Off
  Mac OS X style resource forks                Off
  Mac OS X Finder information                  Off
-----------------------------------------------------------------
Unable to import win32security module. Windows ACLs
not supported by filesystem at backup/rdiff-backup-data/rdiff-backup.tmp.0
escape_dos_devices not required by filesystem at backup/rdiff-backup-data/rdiff-backup.tmp.0
-----------------------------------------------------------------
Detected abilities for destination (read/write) file system:
  Ownership changing                           On
  Hard linking                                 On
  fsync() directories                          On
  Directory inc permissions                    On
  High-bit permissions                         On
  Symlink permissions                          Off
  Extended filenames                           On
  Windows reserved filenames                   Off
  Access control lists                         On
  Extended attributes                          On
  Windows access control lists                 Off
  Case sensitivity                             On
  Escape DOS devices                           Off
  Escape trailing spaces                       Off
  Mac OS X style resource forks                Off
  Mac OS X Finder information                  Off
-----------------------------------------------------------------
Backup: must_escape_dos_devices = 0
Starting mirror /tmp to /backup
При повышении уровня - количество сообщений в консоль увеличивается
5) Удаление старых инкрементных копий
Для того, чтобы не хранить старые версии файлов, есть замечательный метод удаления инкрементных данных:
rdiff-backup --remove-older-than 40W /destination_path
Опция --remove-older-than 40W выполнит удаление всех слепков, старше чем 40 недель.

6) Автоматизация процесса резервирования
Так, ну а теперь напишем небольшой скрипт, который будет выполнять резервное копирование данных и отправлять отчет о проделанной работе. Создадим файл backuper.bin
touch /etc/backuper.bin
И запишем в него следующий код:
#!/bin/sh
###!!! ВАШИ Настройки ЗДЕСЬ !!!###
#Определим сегодняшнюю и вчерашнюю даты
TODAY="$(date +%X.%Y.%m.%d)"
YESTERDAY="$(date -d 'yesterday' +%Y.%m.%d)"
#Ошибки (по умолчанию нет)
ERRORS="no errors"
#Получатели письма счастья )
MAILTO='user1@myil.ru,user2@myil.ru'
MAILFROM='backuper@myil.ru'
SUBJECTED='INCREMENT BACKUP report ('$ERRORS')'
#Что копировать
SAVE_DATA=/DATA_PATH
#Куда копировать
BACKUP_DATA=/BACKUP_PATH
#лог-файл процесса инкрементного копирования
LOGFILE=/tmp/backuplog
#Расположение rdiff-backup
RDIFF='/usr/bin/rdiff-backup'
#Строка запуска инкрементного копирования (доп опции)
EXT_STRING='--force --no-eas --exclude-symbolic-links --exclude-sockets --exclude-special-files --exclude-fifos --exclude-device-files --no-hard-links --print-statistics'
EXT_STRING2='--force --no-hard-links --remove-older-than'
#Уровень логов RDIFF
LOG_LEVEL='-v 7'
#Удалять файлы старше 40 недель
EXPIRE='40W'

#Чистим лог для начала
cat /dev/null > $LOGFILE

##Записываем в начало лога данные, которые будут использованы при отправке письма
echo "To:$MAILTO
From:$MAILFROM
Subject: $SUBJECTED
Content-Type: text/plain; charset=UTF-8; format=flowed
Hi all :D! " >> $LOGFILE

#Дописываем в лог разделитель
echo "
------------------------------------------------------------------
$TODAY
INCREMENT BACKUP for yesterday files($YESTERDAY):" >> $LOGFILE
#Записываем время начала операции копирования
STARTTIME="$(date +%H:%M:%S)"
#Запускаем процесс инкрементного копирования:
$RDIFF $EXT_STRING $LOG_LEVEL $SAVE_DATA $BACKUP_DATA >> $LOGFILE 2>&1

##Удаляем файлы старше чем EXPIRE
#Дописываем в лог разделитель
echo "
------------------------------------------------------------------
Removing old files (EXPIRE=$EXPIRE):" >> $LOGFILE
#Запускаем удаление
$RDIFF $EXT_STRING2 $EXPIRE $BACKUP_DATA >> $LOGFILE 2>&1

#Записываем время начала и конца операции
ENDTIME="$(date +%H:%M:%S)"
echo "
------------------------------------------------------------------
STARTTIME: $STARTTIME
ENDTIME: $ENDTIME" >> $LOGFILE

##Проверка на ошибки
#Если будет найдена ошибка в логе, переменная ERRORS будет изменена
#и в теме письма будет крупно написано ERRORS!!
if [ `cat $LOGFILE | grep 'Error' | grep -v 'Errors 0' | grep -cv grep` != "0" ]; then
    sed -i -e 's/$ERRORS/ERRORS!!/' $LOGFILE
fi

#Отправка почты с помошью ssmtp
/usr/sbin/ssmtp -t < $LOGFILE

exit 0
Думаю не нужно объяснять, что необходимо самостоятельно заполнить поле "ВАШИ Настройки ЗДЕСЬ"
Как вы наверно заметили, в данном примере отправка почты происходит с помощью ssmtp, давайте его установим:
apt-get install ssmtp
И настроим:
mv /etc/ssmtp/ssmtp.conf /etc/ssmtp/ssmtp.conf.BACK
echo "
#Тема для тестовых сообщений
Subject: Test message

#Адрес почтового сервера
mailhub=mail.myil.ru

#От кого будет посылаться сообщение
hostname=backuper@myil.ru

#Использовать шифрование STARTTLS
UseSTARTTLS=no

#метод авторизации
AuthMethod=LOGIN

#Логин
AuthUser=backuper@myil.ru

#Пароль
AuthPass=backuper_psw

#Разрешить изменить адрес отправителя (hostname)
FromLineOverride=YES
 
" >> /etc/ssmtp/ssmtp.conf
Вам самостоятельно нужно заполнить следующие поля:
mailhub - почтовый сервер на который будет выполнена отправка сообщения.
hostname - от кого будет сообщение.
UseSTARTTLS - использовать или нет шифрование STARTTLS.
AuthUser - имя пользователя на почтовом сервере.
AuthPass - пароль на почтовом сервере.

Осталось подкорректировать права запуска файла:
chmod +x /etc/backuper.bin
И добавить задачу в Cron. Пишем # crontab -e, и добавляем в конец строку:
5 0 * * *  /etc/backuper.bin
Таким образом, наш файл /etc/backuper.bin - будет запускаться каждый день в 00 часов 05 минут.

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

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