Небольшой, но весьма полезный скрипт для автоматизации бекапа домашних каталогов пользователей и их баз данных в MySQL. Самая главная особенность, скрипт ведет ротацию бэкапов и может сохранять бэкапы на облачных хранилищах.
ВНИМАНИЕ! — данный скрипт вы используете на свой страх и риск, автор никаких гарантий его работы не дает!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
#!/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 задание.
1 2 |
# crontab -e -u пользователь 00 04 * * 1 /home/backup.sh каталог_пользователя mysql_логин mysql_пароль |
Таким образом каждый понедельник в 4:00 утра будет запускаться бэкап пользователей и бд, если они у них есть.
Свежие мысли