Skip to content

Скрипт бэкапа OVZ контейнеров

Достался в наследство от сенсея.

Изначально бэкап делался рсинком, но из-за высокой I/O нагрузки которую создавал рсинк серверу становилось очень плохо.

Переделал чтобы бэкапилось таром и гзипалось.

Основною попоболью было исключение каталогов. tar упорно не хотел принимать кучу --exclude, не брал их во внимание.

Оказывается exclude подходит для исключения файлов по маске, а для каталогов надо юзать  --exclude-from и уже в файле описывать все нужные исключения.

Пример того как это все работает -

[root@srv bin]# cat increment.sh
#!/bin/sh
#Система резервного копирования контейнеров
#Каждое воскресенье делаем полный бэкап, с понедельника по субботу диференциальные

#проверка на root
#if [ $(id -u) -eq 0 ]; then echo "Root can't do that"; exit 1; fi

[ $# -lt 1 ] &&  { echo "Usage: ${0##*/}"; exit 1; }

TAR="/bin/tar --create --ignore-failed-read --one-file-system --numeric-owner --sparse --totals --wildcards --exclude-from=/usr/local/bin/excluded_dirs --gzip"

SRC_DIR=$1
DST_DIR=$2
[ ! -d $SRC_DIR ] && { echo "Directory $SRC_DIR not found."; exit 1; }
[ ! -d $DST_DIR ] && { echo "Directory $DST_DIR not found."; exit 1; }

VE_LIST=`ls -1 $SRC_DIR`

DOW=`date +%u` # day of week (1..7); 1 is Monday, 7 is Sunday

for VEID in $VE_LIST
do

[ ! -d $SRC_DIR/$VEID ] && continue; #если вдруг попался не каталог, пропускаем его
cd $SRC_DIR/$VEID #перейдем в каталог который будем копировать, что-бы пути в архиве были относительно текущего каталога

if [ $DOW = '7' ] #Еженедельный полный бэкап, создаем новый файл изменений, старый сохраняем.
then
INC_FILE=$DST_DIR/inc$VEID.0
BACKUP_FILE=$DST_DIR/full$VEID.$DOW.tgz
[ -f $INC_FILE ] && mv -f $INC_FILE $INC_FILE.old;
echo "VE $VEID weekly full backup"
else
INC_FILE=$DST_DIR/inc$VEID
if [ -f $INC_FILE.0 ] #Если основного файла изменений нет - создаем его.
then
cp $INC_FILE.0 $INC_FILE
BACKUP_FILE=$DST_DIR/arc$VEID.$DOW.tgz
echo "VE $VEID ${DOW}-s differential backup"
else #Делаем бэкап на основе файла изменений.
INC_FILE=$INC_FILE.0
BACKUP_FILE=$DST_DIR/full$VEID.$DOW.tgz
echo "Incremental file not found for VE $VEID, full backup"
fi
fi

$TAR --file=$BACKUP_FILE --listed-incremental=$INC_FILE ./ 2>&1

done

[root@vhn1 bin]# cat /usr/local/bin/excluded_dirs
proc
sys
var/spool/asterisk/monitor
usr/local/BGInetAccounting

 

Leave a Reply

Your email address will not be published. Required fields are marked *

π