+7 (905) 503 02-20

Резервное копирование Bash


В битриксе есть стандартный функционал для создания резервных копий в файловую систему, в облако. Есть возможность запланировать резервное копирование. Но за долгие годы использования битрикса случались проблемы с резервными копиями, то архивы не полные, то некоторых частей архива не хватает, то база отказывается принимать дамп. В общем, было решено иметь в виду битриксовский функционал, но пользоваться Bash скриптом. Да и для самописного сайта способ пригодится, если в нем вообще никакой функционал резервного копирования не предусмотрен. О том как этот скрипт себе внедрить на сервер, я сейчас и расскажу.

И так, мы подключились к SSH. Нам нужно определиться куда мы будем складывать наши архивы. Создадим для этого директорию, желательно на уровень ниже корневой директории нашего сайта для того, чтобы архивы не были доступны из публичной части. Предположим сайт у нас располагается в /var/www/mysite, то каталог для резервных копий сделаем в /var/www/backups. Конечно можно указать любой другой.

mkdir -p -m 700 /var/www/backups

-p не выводить ошибку, если каталог уже существует; -m права на доступ к файлу, устанавливаем 700 полный доступ только владельцу.

Создаем в этой же директории, или в любой другой удобной Вам, файл backup.sh. И так же как и на директорию устанавливаем права 700 полный доступ только владельцу.

vi /var/www/backups/backup.sh
chmod 700 /var/www/backups/backup.sh

В файл backup.sh вносим ниже описанные строки или можно скачать backup.sh

#SSH Backup Script v 0.1 Byte Eight Lab 24.12.2014 info@byteeightlab.ru http://byteeightlab.ru/article/bel_bash_beckup/
#!/bin/bash

export BACKUPNAME="backup_"`date +%Y-%m-%d-%H-%M-%S`;		#имя архива
export BACKUPPAHT="/var/www/backups"						#директория с резервными копиями
export SITEPAHT="/var/www/mysite"							#корневой каталог сайта

export DBHOST="localhost"			#хост базы данных 
export DBUSER="root"				#имя пользователя
export DBPASS="123456"				#пароль
export DBNAME="db_mysite"			#имя базы

echo "Создаем резервную копию базы "$DBNAME
touch $SITEPAHT/$DBNAME.sql
chmod 600 $SITEPAHT/$DBNAME.sql
mysqldump -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME > $SITEPAHT/$DBNAME.sql
echo "Создаем резервную копию файловой системы "$SITEPAHT
cd $SITEPAHT
tar -zcf $BACKUPPAHT/$BACKUPNAME.tar.gz `ls` > $BACKUPPAHT/errorlog.txt
rm $SITEPAHT/$DBNAME.sql
echo "Готово. Архив - "$BACKUPPAHT/$BACKUPNAME.tar.gz

Теперь немного о содержимом.
BACKUPNAME - имя архива; в имени будет указана дата и время создания бэкапа
BACKUPPAHT - абсолютный путь до каталога в котором будем хранить архивы
SITEPAHT - абсолютный путь до корневого каталога сайта, который мы будем бэкопировать

DBHOST, DBUSER, DBPASS, DBNAME - хост, пользователь, пароль, имя базы данных для создания резервной копии

В случае возникновения ошибок во время архивации, они будут записаны в файл errorlog.txt в директорию указанную в BACKUPPAHT.

Cron - демон-планировщик

Теперь ним нужно задать расписание создания резервных копий. Для этого мы отредактируем crontab при помощи команды:

crontab -e

Можно так же отредактировать используя любой другой редактор, обычно crontab располагается по пути /etc/crontab. В него мы запишем следующую строку:

0 2 * * 2 root /bin/bash /var/www/backups/backup.sh | mail -s "Запланированное резервное копирование" admin@mysite.ru

Данная запись означает, что наш скрипт будет запускаться раз в неделю - во вторник в 2 часа ночи. root - пользователь от имени которого будем запускать скрипт. По окончанию резервного копирования на email указанный в конце записи admin@mysite.ru придет письмо с заголовком. Запланированное резервное копирование. В теле письма будет содержаться лог резервного копирования. Это служит хорошим напоминанием от том, что резервные копии нужно скачивать в более безопасное место, да и гораздо спокойнее когда знаешь что бэкап всегда есть.

При желании в этот же скрипт можно дописать передачу резервной копии на удаленный ftp, ssh, или куда то еще, но тут уже требуется боле тонкая настройка.

Разделение архива на части

Если архив весит неприлично много, его можно разделить, добавив после:

tar -zcf $BACKUPPAHT/$BACKUPNAME.tar.gz `ls` > $BACKUPPAHT/errorlog.txt

эти строки:

cd $BACKUPPAHT
split -b 500M $BACKUPPAHT/$BACKUPNAME.tar.gz $BACKUPNAME"_"
rm $BACKUPPAHT/$BACKUPNAME.tar.gz

split -b 500M - 500M означает что архив будет разделен по 500 мегабайт, можно записать в гигабайтах 1G

Собрать разделенный архив можно так:

cat MASC* > FILENAME

Восстановление резервной копии

Получившийся скрипт создает 1 архив, в котором сразу находятся файлы (без дополнительных каталогов), расположенные по адресу SITEPAHT и дамп базы данных. Для того, чтобы восстановить резервную копию, распакуем архив, запишем дамп обратно в базу, и УДАЛИМ ДАМП БАЗЫ И АРХИВ. В противном случае может получится, что эти файлы будут доступны для скачивания, что не очень хорошо.

cd /var/www/mysite/ #переходим в каталог сайта
tar -xvf backup_.tar.gz #распаковываем архив
rm backup_.tar.gz #удаляем архив
mysql db_mysite< db_mysite.sql #восстанавливает дамп
rm db_mysite.sql #удаляем дамп