Резервное копирование по расписанию

Урок 239 из 259
Автор: Ольга Пичужкина
Сложность урока:
3 уровень - средняя сложность. Необходимо внимание и немного подумать.
3 из 5
Дата изменения: 13.03.2019
Просмотров: 9053
Ограничения по редакциям: Ограничений нет

В Bitrix Framework есть функционал резервного копирования, но для создания резервной копии требуется участие администратора. Создание резервных копий по расписанию не предусмотрено, так как есть объективные причины, не позволяющие это сделать достаточно эффективно.

Создание архива - длительный и ресурсоёмкий процесс, на один хит это делать никак нельзя.

Варианты решения задачи:

  • сделать интерфейс, через который можно запускать создание архива через внешний планировщик (cron);
  • использовать системные инструменты.

Рассмотрим вариант для Unix:

Создаем скрипт

Как улучшить

Удаление старых архивов

Автоматическое восстановление

Как пользоваться?

Имеем unix-подобную систему (Linux, Freebsd и т.д.) и возможность ставить задачи на cron. Традиционно unix предоставляет утилиту tar для создания архивов и bzip для сжатия, а база данных MySQL - утилиту создания дампа базы mysqldump.

Создаем скрипт

Архив портала по сути представляет дамп базы данных (содержимое БД в виде файла) и все файлы сайта (включая публичную часть и ядро Bitrix Framework).

Значит, перейдём в корень портала и дамп базы создадим командой:

mysqldump -hhost -uuser -ppass dbname > dump.sql

А архив создадим командой:

tar -czf archive.tar.gz 

Теперь если это оформить в простейший скрипт, получим:

#!/bin/sh
###### Config ######
doc_root=/home/denis/www/test
host=localhost
username=username
password=secret
database=sitemanager_demo_start
charset=cp1251
###################
cd $doc_root &&
mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $doc_root/bitrix/backup/archive.sql &&
tar -czf $doc_root/bitrix/backup/archive.tar.gz . &&
echo OK

В коде вводятся параметры конфигурации, необходимо указать соответственно свои:

  • путь к корневой папке портала (значение DOCUMENT_ROOT в phpinfo),
  • имя хоста,
  • имя пользователя,
  • пароль и имя БД,
  • кодировку базы данных. Для портала в UTF-8 надо написать utf8, иначе оставить как есть.
Примечание: Обратите внимание, что пробелы ни перед, ни после "равно" не ставятся.

Этот вариант скрипта переходит в корень портала, создаёт дамп базы в кодировке, которую мы указали, затем создаёт в папке bitrix/backup архив сайта.

Конструкция && позволяет прервать выполнение в случае ошибки (например, не удалось подключиться к базе).

Это будет работать, но в архив попадут архивы сайта, созданные ранее, кеш, да и часть текущего архива тоже, что, прямо скажем, не очень красиво. Поэтому скрипт лучше модифицировать.

Как улучшить

Можно воспользоваться параметром исключения --exclude для папки bitrix/backup, добавив дамп базы, который лежит в этой папке, отдельным вызовом. Заодно можно упростить настройку скрипта, адаптировав его под Bitrix Framework, ведь мы же знаем, что все данные подключения к базе хранятся в bitrix/php_interface/dbconn.php. Тогда в качестве настройки можно будет использовать только путь к корневой папке портала.

#!/bin/sh
doc_root=$1
name=$2
if [ -z $doc_root ]; then
   echo Usage: $0 /path/to/document/root [backup_name]
   exit
fi

if [ -z $name ]; then
   name=backup
fi

dbconn=$doc_root/bitrix/php_interface/dbconn.php

readcfg() {
   grep $1 $dbconn | sed 's/.*"\(.*\)".*/\1/'
}

host=`readcfg DBHost`
username=`readcfg DBLogin`
password=`readcfg DBPassword`
database=`readcfg DBName`

utf=`grep 'BX_UTF' $dbconn | grep true`

if [ -z "$utf" ]; then
   charset=cp1251
else
   charset=utf8
fi

backup_dir=$doc_root/bitrix/backup

if [ ! -e $backup_dir ]; then
   mkdir $backup_dir
fi

cd $doc_root && 
mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql && 
tar -cf $backup_dir/$name.tar $backup_dir/$name.sql &&  
rm $backup_dir/$name.sql &&
tar -rf $backup_dir/$name.tar --exclude '*bitrix/tmp/*' --exclude '*bitrix/updates/*' --exclude '*bitrix/backup/*' --exclude '*bitrix/*cache/*' . && 
gzip -f -9 $backup_dir/$name.tar && 
echo OK && exit
echo Error

Этот вариант скрипта читает параметры dbconn.php, подключается к базе данных, делает дамп. Затем делает архив портала и сжимает его. Дамп удаляет. В случае необходимости создаёт папку bitrix/backup.

На вход скрипт принимает два параметра: путь к корню портала и имя архива без расширения (не обязательный, по умолчанию backup).

В случае успеха пишет ОК, иначе Error.

Удаление старых архивов

В описанном варианте если имя архива не меняется - он каждый раз переписывается. Если меняется имя архива, можно легко сделать удаление старых бэкапов. Например, удаляем архивы старше недели:

заменяем строку
echo OK && exit
на
find $backup_dir -ctime +7 -exec rm {} \; && echo OK && exit

Автоматическое восстановление

Технически с помощью скрипта можно производить и автоматическое восстановление. Но автоматическое восстановление портала - процедура не безопасная. Что-то пойдёт не так и портал «упадёт». Это следует делать с большой осторожностью.

Хотя само по себе восстановить базу несложно. Замените

mysqldump -h$host -u$username -p$password --default-character-set=$charset $database > $backup_dir/$name.sql
на
mysql -h$host -u$username -p$password --default-character-set=$charset $database < $backup_dir/$name.sql
и удалите всё что ниже.

Внимание ! И всё же мы настоятельно не рекомендуем это делать на живом проекте в автоматическом режиме.

Как пользоваться?

  1. Сохраняем код скрипта в файле на хостинге, желательно за пределами корня портала, например backup.sh, делаем исполняемым:
    chmod +x backup.sh
  2. Проверяем из корня портала:
    ./backup.sh
    Должно отобразиться OK, а в папке bitrix/backup появиться файл backup.tar.gz.
  3. С целью безопасности лучше задать имя архива, иначе злоумышленник сможет скачать его по прямой ссылке: http://portal.ru/bitrix/backup/backup.tar.gz/ Например:
    /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup
  4. Добавляем задачу на cron. Если мы хотим делать резервную копию регулярно в час ночи, пишем:
    crontab -e
    и
    0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup
  5. А если надо, чтобы каждый раз создавался новый архив с именем даты, запись может иметь вид:
    0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup_`date +\%Y\%m\%d`

Если на хостинге не действуют ограничения на время работы скриптов через cron (или они достаточно щадящие), то этот вариант должен нормально работать в большинстве случаев.



Текст раскрывает тему
Мы стараемся сделать документацию понятнее и доступнее,
и Ваше мнение важно для нас
Нам жаль это слышать… Но мы постараемся быть лучше! Поясните, пожалуйста, свой выбор:

Мы благодарны вам за помощь в улучшении документации.

Курсы разработаны в компании «1С-Битрикс»