Скрипт для бэкапа баз и каталогов пользователей v.0.6 (Обновленный)

📅 15 Сен 2014 17:13 | 👁 56 | 🕐 3 мин.

Небольшой, но весьма полезный скрипт для автоматизации бекапа домашних каталогов пользователей и их баз данных в MySQL. Самая главная особенность, скрипт ведет ротацию бэкапов и может сохранять бэкапы на облачных хранилищах.

ВНИМАНИЕ! – данный скрипт вы используете на свой страх и риск, автор никаких гарантий его работы не дает!

#!/bin/sh -
# Ключи sh -vx для отладки

# Copyright labor24krs v.0.6
# Chengelog
# v.0.6
# - Добавлен бэкап расписания задачь пользовательских crontab
# v.0.5
# - Добавлена очистка локальных бекапов, локально хранится только вчерашний
# v.0.4
# - Добавлена поддержка облака 4shared
# - Добавлена возможность вести EXCLUDE_list для каждого пользователя
# - Ротация архивов ведется на стороне облака, на локальной файловой систиме
# сохраняется архив только за прошлые сутки
# v.0.3
# - Добавлена возможность создание экстренных бэкапов
# v.0.2
# - Добавлена ротация бэкапов на текущий момент для расписания
# бэкапа каждую неделю, ротация будет происходить раз в сутки.
# v.0.1
# - Добавлено создание бэкапа бд пользовотелей
# v.0.0
# - Создание бэкапа каталога пользователя

# Параметры запуска скрипта
# ./backup.sh каталог_пользователя mysql_логин mysql_пароль [1](экстра флаг, если нужен)

user=$1
mysql_user=$2
mysql_pass=$3

cloud_mount=https://webdav.4shared.com/
cloud_dir=/mnt/backup-4shared

# Специальный параметр для экстренных бэкапов в ручном режиме
extra=$4

# Определяем текущую дату
date=`/bin/date +%d%m%Y`

# Время создания экстренного бэкапа
date_extra=`/bin/date +%H%M%d%m%Y`

# Удаление локальных бэкапов
date_local_old=`/bin/date --date="1 days ago" +%d%m%Y`

# Определяем дату устаревшего архива
date_old=`/bin/date --date="1 weeks ago" +%d%m%Y`

# Каталог для бэкапов
bc_dir=/home/backup

# Каталог для бэкапа mysql баз
mysql_dir=/home/$user/mysql_bases

 

# Проверяем заданы ли параметры mysql для бэкапа бд
if [ $mysql_user != '' ]
then
# Проверяем есть ли временный каталог для баз
if [ -d $mysql_dir ]
then
# Если есть, удаляем и создаем снова
rm -rf $mysql_dir
mkdir -p $mysql_dir

# Создаем бэкапы всех доступных бд пользователю во временный каталог
for i in `mysql -u $mysql_user -p$mysql_pass -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -u $mysql_user -p$mysql_pass $i > $mysql_dir/$date-$i.sql; done
else
# Если нет, создаем
mkdir -p $mysql_dir

# Создаем бэкапы всех доступных бд пользователю во временный каталог
for i in `mysql -u $mysql_user -p$mysql_pass -e'show databases;' | grep -v information_schema | grep -v Database`; do mysqldump -u $mysql_user -p$mysql_pass $i > $mysql_dir/$date-$i.sql; done
fi
fi

# Монтируем облачное хранилище
mount -t davfs $cloud_mount $cloud_dir

cd /home

# Проверяем обычный или экстренный архив
if [ $extra != '' ]
then
# Создаем бэкап расписаний crontab
crontab -u $user -l > /home/$user/crontab-$user.backup

# Создаем эксренный архив пользователя
tar -czf /home/backup/$date_extra-extra-$user.tar.gz --exclude-from=/home/$user/EXCLUDE_list $user
cp /home/backup/$date_extra-extra-$user.tar.gz $cloud_dir/backups/$user/&
pid=$!
wait $pid
rm -rf $mysql_dir

# Размонтрование облачного хранилища
umount $cloud_mount
else
if [ -f $bc_dir/$date-$user.tar.gz ]
then
echo 'Архив за это число уже имеется, воспользуйтесь экстра ключом.'
else
# Создаем бэкап расписаний crontab
crontab -u $user -l > /home/$user/crontab-$user.backup

# Создаем архив каталога пользователя
tar -czf /home/backup/$date-$user.tar.gz --exclude-from=/home/$user/EXCLUDE_list $user

# Копируем архив в облочное хранилище
cp /home/backup/$date-$user.tar.gz $cloud_dir/backups/$user/

# Удаляем временный каталог для бд из каталога пользователя
if [ -f $bc_dir/$date-$user.tar.gz ]
then
# Проверяем есть ли временный каталог для баз
if [ -d $mysql_dir ]
then
rm -rf $mysql_dir
fi
else
echo $date 'Бэкап не создан!' >> /home/backup.log
fi

# Удаляем старые архивы с облака
if [ -f $cloud_dir/backups/$user/$date_old-$user.tar.gz ]
then
rm $cloud_dir/backups/$user/$date_old-$user.tar.gz&
pid=$!
wait $pid
fi

# Удаляем старые архивы с локального диска
if [ -f /home/backup/$date_local_old-$user.tar.gz ]
then
rm /home/backup/$date_local_old-$user.tar.gz
fi

# Размонтрование облачного хранилища
umount $cloud_mount
exit 0;
fi
fi

Теперь осталось только добавить в crontab задание.

# crontab -e -u пользователь
00 04 * * 1 /home/backup.sh каталог_пользователя mysql_логин mysql_пароль

Таким образом каждый понедельник в 4:00 утра будет запускаться бэкап пользователей и бд, если они у них есть.

Поделиться