Всем привет.
В битриксе есть своя система для создания резервных копий, но для больших проектов, на мой взгляд, она не очень подходит. Сегодня я расскажу о своем методе создания бэкапов проектов на Битриксе.
Что будем сохранять:
- Папку проекта
- Отдельно папку upload
- Базу данных
Что будем использовать:
- Bash скрипт для сохранения базы
- Bash скрипт для импорта базы
- Утилиту backup-manager
- Bash скрипт выполняющий все действия
Начнем с копии базы.
Обычно дамп всей базы данных хранят в одном файле, из чего возникает ряд неудобств:
- Установленный битрикс содержит очень большое количество таблиц
- Трудно извлечь данные одной или нескольких таблиц
- Большой размер дампа
Наш скрипт будет делать дамп отдельно для каждой таблицы
Сначала организуем структуру хранения данных:
В папке mnt корня нашего раздела создадим папки:
- backup_db -тут буду храниться файлы с дампом каждой таблицы для каждой базы
- backup_data_db - папка с архивами баз (нужна для выгрузки по фтп)
- backup_data - архивы проектов
Создадим в папке /root sh файл backup_db.sh со следующим содержимым:
#!/bin/bash
PASSWORD=$3;
HOST='localhost'
USER=$2
BASE=$1
if [ -n "$BASE" ] && [ -n "$USER" ] && [ -n "$PASSWORD" ]
then
DIR="/mnt/backup_db/$BASE/"
mkdir -p $DIR
# удаляем старые бэкапы этой базы
cd $DIR
rm -rf *
# делаем дампы
db=`mysql -u $USER -h $HOST -p$PASSWORD $BASE -Bse 'show tables'`
for n in $db; do
mysqldump -u $USER -h $HOST -p$PASSWORD $BASE $n > "$DIR$n.sql"
#sleep 1
done
else
echo "Не указаны параметры соединения"
fi
Используемые переменные:
HOST - хост для подключения к базе
BASE - имя бд (также будет называться папка)
USER - пользователь бд
PASSWORD - пароль пользователя
Описание работы скрипта:
При запуске скрипт будет удалять папку с прошлым бэкапом базы(если такая имеется), далее подключается к базе, делает запрос show tables, для получения списка таблиц базы и циклом создает дамп каждой таблицы.
Для запуска нужна подключиться по ssh под рутом и из домашней папки выполнить скрипт
./backup_db.sh имя базы имя пользователя пароль
Если после завершения работы скрипта в папке /mnt/backup_db появились файлы дампов - все прошло успешно.
Сразу создадим обратный скрипт, который будет импортировать таблицы.
В папке /root создадим файk import_tables.sh:
#!/bin/bash
HOST='localhost'
BASE=$1
USER=$2
PASSWORD=$3;
if [ -n "$BASE" ] && [ -n "$USER" ] && [ -n "$PASSWORD" ]
then
DIR="/mnt/backup_db/$BASE/"
cd $DIR
#-h $HOST
for n in `ls`; do
mysql -u $USER -p$PASSWORD $BASE < "$n"
#echo $n
done
else
echo "Не указаны параметры соединения"
fi
Описание работы скрипта:
Скрипт смотри папку /mnt/backup_db/имя_базы, в цикле импортирует каждый файл в базу.
Пока оставим базу и перейдем к утилите backup-manager
Установка под Debian
apt-get install backup-manager
После установки в папке /etc/ должен появиться файл со стандартным конфигом
Backup-manager.conf
Мы будем запускать backup-manager используя свои конфигурации(их будет 3: базы, папка сайта(без upload) и отдельно upload). Можно придумать и другую схема, но эта мне показалась оптимальной.
Создадим в папке /etc/ папку backup-manager-conf
В ней разместим три конфига:
- backup-manager-sites-with_core_and_no_upload.conf
- backup-manager-upload.conf
- backup-manager-db.conf
Мой вариант конфига backup-manager-sites-with_core_and_no_upload.conf
export BM_DAILY_CRON="false"
export BM_REPOSITORY_ROOT="/mnt/backup_data"
export BM_TEMP_DIR="/mnt/tmp"
export BM_REPOSITORY_SECURE="true"
export BM_REPOSITORY_USER="root"
export BM_REPOSITORY_GROUP="root"
export BM_REPOSITORY_CHMOD="770"
export BM_UPLOAD_FTP_TIMEOUT="900"
export BM_ARCHIVE_CHMOD="660"
export BM_ARCHIVE_TTL="1"
export BM_ARCHIVE_FREQUENCY="daily"
export BM_REPOSITORY_RECURSIVEPURGE="false"
export BM_ARCHIVE_PURGEDUPS="true"
export BM_ARCHIVE_PREFIX="$HOSTNAME"
export BM_ARCHIVE_STRICTPURGE="true"
export BM_ARCHIVE_NICE_LEVEL="10"
export BM_ARCHIVE_METHOD="tarball"
export BM_TARBALL_NAMEFORMAT="long"
export BM_TARBALL_FILETYPE="tar.gz"
export BM_TARBALL_OVER_SSH="false"
export BM_TARBALL_DUMPSYMLINKS="false"
declare -a BM_TARBALL_TARGETS
BM_TARBALL_TARGETS[0]="путь к вашему проекту от корня"
BM_TARBALL_TARGETS[1]="путь к вашему проекту от корня"
export BM_TARBALL_TARGETS
export BM_TARBALL_BLACKLIST="путь к вашему проекту от корня/upload"
export BM_TARBALL_SLICESIZE="1000M"
export BM_TARBALL_EXTRA_OPTIONS=""
export BM_TARBALLINC_MASTERDATETYPE="weekly"
export BM_TARBALLINC_MASTERDATEVALUE="1"
export BM_PIPE_COMMAND
export BM_PIPE_NAME
export BM_PIPE_FILETYPE
export BM_PIPE_COMPRESS
#выгрузка по FTP
export BM_UPLOAD_METHOD="ftp"
#имя фтп поьзователя
export BM_UPLOAD_FTP_USER=""
# его пароль
export BM_UPLOAD_FTP_PASSWORD=""
# хост для подключения
export BM_UPLOAD_FTP_HOSTS=""
# путь на удаленном сервере
export BM_UPLOAD_FTP_DESTINATION=""
export BM_UPLOADFTP_TTL="2"
export BM_UPLOAD_FTP_PURGE="true"
export BM_LOGGER="true"
export BM_LOGGER_LEVEL="warning"
export BM_LOGGER_FACILITY="user"
Основные настройки:
BM_REPOSITORY_ROOT - папка куда будут складываться архивы
BM_TARBALL_TARGETS - массив путей папок, которые будем бэкапить
BM_TARBALL_BLACKLIST - исключения, перечислять через запятую. В данном случае мы исключаем папку upload.
В моем примере показан способ выгрузки по фтп. Другие вариант есть в стандартном конфиге. Если не собираетесь выгружать удалите настройки BM_UPLOAD_METHOD и все, что начинается с BM_UPLOAD_FTP
Для конфига backup-manager-upload.conf измените BM_TARBALL_TARGETS на пути к папкам upload ваших проектов. Все остальное можно оставить. В конфиге backup-manager-db.conf изменим BM_REPOSITORY_ROOT на /mnt/backup_data_db, а в BM_TARBALL_TARGETS укажем пути для папок с таблицами наших баз. Backup-manager создаст архивы из этих папок и выгрузит их(если это задано в конфиге)
Теперь, когда у нас почти все готово, создадим bash скрипт, который будет выполнять все действия. В папке /root создадим файл backupper.sh :
#!/bin/bash
# очищаем папки от старых бэкапов
rm -rf /mnt/backup_db
rm -rf /mnt/backup_data/*
rm -rf /mnt/backup_data_db/*
rm -rf /mnt/backup_upload/*
#step1 - создаем дампы
~/backup_db.sh ИМЯ БАЗЫ ПОЛЬЗОВАТЕЛЬ ПАРОЛЬ
~/backup_db.sh ИМЯ БАЗЫ2 ПОЛЬЗОВАТЕЛЬ ПАРОЛЬ
# Запуск заданий bc-manager
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-db.conf
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-upload.conf
/usr/sbin/backup-manager -c /etc/backup-manager-conf/backup-manager-sites-with_core_and_no_upload.conf
Все готово. Можно запускать из консоли:
./backupper.sh
И ждем, процесс может длиться в долго. Если все прошло успешно, ставим данный скрипт в крон и наслаждаемся результатом.
Советую ознакомиться с возможностями backup-manager, т.к. Описанное мною, далеко, не все, что он умеет (а умеет он очень много).
Спасибо за внимание! На Ваши вопросы, с радостью, отвечу в комментариях!