Backup с помощью rsync на Debian

Вы все еще не делаете backup? Я предлагаю вам довольно эффективный способ делать бэкапы — rsync+crontab. Главным преимуществом данного метода перед обычным копированием (cp) — скорость работы, т.к. копируются не все файлы, а только те, которые были изменены после предварительного бэкапа.

Для начала я смонтировал второй HDD в папку /backup, но можно копировать и на этот же жиск, но тогда какой смысл от бэкапов?
Выполняем команду:

sudo rsync -var --delete --stats /home /backup

После выполнения данной команды, в каталоге /backup появится каталог /home со всем его содержимым.
А теперь подробнее:
Параметр -v: просмотр хода работы.
Параметр -a: указывает на то, что необходимо сохранить все атрибуты файлов.
Параметр -r: двигаться по каталогам рекурсивно.
Параметр —delete: файлы которые были удалены в источнике, будут удалены и в приемнике.
Параметр —stats: выводит подробную статистику по окончанию работы.
/home — каталог источник.
/backup — каталог приемник.

Теперь, для того чтобы «все делалось само» создадим скрипт примерно следующего содержания:

#!/bin/bash
#/home:
rsync -ar --delete /home /backup
# /var/www:
rsync -ar --delete /var/www /backup

И занесем его в кронтаб:

# m h  dom mon dow   command
00 05 * * *     /backup/rsync.backup

Еще один вариант бэкапа (предложил devilben):
отдельный диск примонтирован в /data, в /data следующая структура:

/data/backup/scripts — скрипты
/data/backup/sql — для бэкапов БД
/data/backup/sync — куда rsync будет синхронизировать данные
/data/backup/pack — для упакованных бэкапов 

сам скрипт для rsync:

#!/bin/bash
# это на случай если скрипт понадобится усложнить
BACKDIR="/data/backup"
# пишем лог выполнения синхронизации
LOG="/var/log/backup/sync.log"

echo "[`date +%F-%T`] View a list of folders for data synchronization." >> $LOG
cat "$BACKDIR/scripts/synclist.conf" | while read line;
do
    if [ ${#line} != 0 ]
    then                         #синхронизируем...
        rsync -ar --delete $line
    fi
echo "[`date +%F-%T`] Synchronization data $line ." >> $LOG
done
echo "[`date +%F-%T`] Completed ." >> $LOG

какие папки синхронизировать, перечисляем в synclist.conf, например:

/etc /data/backup/sync
/var/www /data/backup/sync

скрипт по крону запускается каждый час.
Упаковка в отдельную папку и ротация:

#!/bin/bash
# где лежат бэкапы которые синхронит rsync
DIR="/data/backup/sync"
# где будем хранить архивы
PACKDIR="/data/backup/pack"
# форматируем дату
DATE=`date +%F`
# пишем лог
LOG="/var/log/backup/packing.log"

# идем в папку с бекапами, и переносим их в другую папку пакуя на лету
cd $DIR

echo "[`date +%F-%T`] Packaging catalog '/WWW'." >> $LOG
tar -c www | bzip2 > $PACKDIR/$DATE.www.tar.bz2

echo "[`date +%F-%T`] Packaging catalog '/etc'." >> $LOG
tar -c etc | bzip2 > $PACKDIR/$DATE.etc.tar.bz2

# проверяем на наличие архивов старше недели и удаляем, если такие имеются
echo "[`date +%F-%T`] Removal of old backups ." >> $LOG
find $PACKDIR -mtime +6 -delete

скрипт для упаковки запускается каждые сутки

скрипт бэкапа БД все в одном:

#!/bin/bash
# пользователь mysql с правами select и lock
USR="backuper"
# его пароль
PASSWD="password"
#мыло на которое слать бэкап
[email protected]
# путь к бэкапам что бы сто раз не писать вдруг чё
BACKDIR="/data/backup"
# форматируем дату
DATE=`date +%F_%H.%M`
# пишем лог
LOG="/var/log/backup/mysql.log"

# создаем временную папку, переходим в нее, пишем лог
echo "[`date +%F-%T`] Create a temporary folder." >> $LOG
mkdir $BACKDIR/sql/$DATE
cd $BACKDIR/sql/$DATE

##
# читаем файлик dumplist.conf в который кстати пишем название баз которые нужно дампить,
# (каждая база пишется с новой строчки) и собственно кладем что получили во временную папку
##
echo "[`date +%F-%T`] Reading the list of databases in a dump." >> $LOG
cat "$BACKDIR/scripts/dumplist.conf" | while read line;
do
    if [ ${#line} != 0 ]
    then
        mysqldump -u$USR -p$PASSWD $line > "$line.sql"
    fi
echo "[`date +%F-%T`] Dump database $line." >> $LOG
done

# перешли в каталог на уровень выше
cd ..

# упаковываем и обзываем в виде даты создания полученное содержимое
echo "[`date +%F-%T`] Packing resulting backup." >> $LOG
tar -c $DATE | bzip2 > $DATE.tar.bz2
# удаляем папку так как зачем нам папка если есть теперь архив
echo "[`date +%F-%T`] Remove the temporary folder." >> $LOG
rm -rf $DATE
# отправляем на почту копию
echo "[`date +%F-%T`] Sending a copy to $MAILTO ." >> $LOG
mpack -s "$DATE.tar.bz2" -c application/octet-stream $BACKDIR/sql/$DATE.tar.bz2 $MAILTO
# проверяем на наличие олдфагов, все что старше недельной давности удаляется
echo "[`date +%F-%T`] Removal of old backups ." >> $LOG
find $BACKDIR/sql -mtime +6 -delete
echo "[`date +%F-%T`] Completed ." >> $LOG

для отправки на почту нужно установить mpack, настраивать ничего не нужно, скрипт бэкапа БД, например, запускается пять раз в сутки.
Для бэкапа mysql необходимо создать юзера с правами lock tables. 
Для создания из консоли необходимо ввести:

$ mysql -pПАРОЛЬ
mysql> CREATE USER ‘backuper’@'localhost’ IDENTIFIED BY ’password';
mysql> GRANT SELECT , LOCK TABLES ON * . * TO ‘backuper’@'localhost’ IDENTIFIED BY ’password';

либо через phpmyadmin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.