В продукте есть функционал резервного копирования, но для создания резервной копии требуется участие администратора. Создание резервных копий по расписанию не предусмотрено. Недоделка? Нет, есть объективные причины, не позволяющие это сделать достаточно эффективно.
Создание архива - длительный и ресурсоёмкий процесс, на один хит это делать никак нельзя.
Повесить по шагам на агенты? Представьте как посетители будут работать с сайтом если на каждый хит создаётся часть резервного архива: это будут жуткие тормоза.
Делать совсем маленькими шагами? Тогда создание архива может затянуться на целый день (дни), а информация на сайте успеет обновиться.
Как же быть? Сделать интерфейс, через который можно запускать создание архива через внешний планировщик (cron)? Правильно! Тогда возникает вопрос: зачем? Ведь можно использовать системные инструменты. И здесь хочу показать, как это делать.
дополнил вариантом для windows
25.09.2009 - добавил исключения в скрипт
[spoiler]
Исходные данные
Имеем unix подобную систему (linux, freebsd и т.д.) и возможность ставить задачи на cron (может не быть ssh, а доступ к cron через панель управления хостингом). Традиционно unix предоставляет утилиту tar для создания архивов и bzip для сжатия, а база данных MySQL - утилиту создания дампа базы mysqldump.
Вариант для windows внизу.
Что надо сделать
Архив сайта по сути представляет дамп базы данных (содержимое БД в виде файла) и все файлы сайта (включая публичную часть и ядро битрикса).
Значит перейдём корень сайта дамп базы создадим командой:
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/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".
Как пользоваться
Сохраняем код скрипта в файле на хостинге, желательно за пределами корня сайта, например backup.sh, делаем исполняемым:
chmod +x backup.sh |
./backup.sh . |
С целью безопасности лучше задать имя архива, иначе злоумышленник сможет скачать его по прямой ссылке:
Например:
/home/denis/bin/backup.sh /var/www/test f43tg245g2_backup |
Теперь надо добавить задачу на cron. Если мы хотим делать резервную копию регулярно в час ночи, пишем:
crontab -e |
0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup |
А если надо, чтобы каждый раз создавался новый архив с именем даты, запись может иметь вид:
0 1 * * * /home/denis/bin/backup.sh /var/www/test f43tg245g2_backup_`date +\%Y\%m\%d` |
Если на хостинге не действуют ограничения на время работы скриптов через cron (или они достаточно щадящие), то этот вариант должен нормально работать в большинстве случаев.
Что делать если хостинг на windows
В комментариях указали на упущение мной этой малоизвестной, но в то же время популярной в определённых кругах платформы
На мой взгляд, использовать shell скрипты в этом случае не очень удобно. Предлагаю аналог скрипта выше, написанный на php.
Для создания дампа он использует утилиту mysqldump, соответственно, она должна лежать в стандартных путях запуска (или укажите в коде скрипта полный путь).
Архив tar.gz создаётся на базе класса битрикс (того же, что и в штатной системе резервного копирования). Параметры запуска те же: первый обязательный - это путь к корню сайта, второй - имя архива.
У меня установлено веб окружение в E:\WEB, делал архив командой:
e:\web\apache\php e:\web\www\test\backup.php e:\web\www\test |
Код скрипта следующий:
<? $_SERVER['DOCUMENT_ROOT'] = $argv[1]; if (!$_SERVER['DOCUMENT_ROOT']) die('Usage: '.basename(__FILE__).' /path/to/document/root'."\n"); $_SERVER['DOCUMENT_ROOT'] = str_replace('\\','/',$_SERVER['DOCUMENT_ROOT']); $name = $argv[2] ? $argv[2] : 'backup'; require($_SERVER['DOCUMENT_ROOT'].'/bitrix/php_interface/dbconn.php'); ini_set('max_execution_time',0); $charset = defined('BX_UTF') && BX_UTF ? 'utf8' : 'cp1251'; $backup_dir = $_SERVER['DOCUMENT_ROOT'].'/bitrix/backup'; if (!file_exists($backup_dir)) mkdir($backup_dir); shell_exec("mysqldump -h$DBHost -u$DBLogin -p$DBPassword --default-character-set=$charset $DBName > $backup_dir/$name.sql"); require($_SERVER['DOCUMENT_ROOT'].'/bitrix/modules/main/classes/general/tar_gz.php'); function getmicrotime() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); } function Store($path) { global $arch; $path = str_replace('\\','/',$path); if (preg_match('#^'.$_SERVER['DOCUMENT_ROOT'].'/bitrix/backup#',$path) || preg_match('#^'.$_SERVER['DOCUMENT_ROOT'].'/bitrix/[^/]*cache/#',$path)) return; $arch->AddFile($path,'',$_SERVER['DOCUMENT_ROOT']); if (is_dir($path)) { $dir = opendir($path); while(false !== $file=readdir($dir)) { if ($file=='.' || $file=='..') continue; Store($path.'/'.$file); } closedir($dir); } } $arch = new CArchiver($backup_dir.'/'.$name.'.tar.gz', true); $arch->_openWrite(); $arch->AddFile("$backup_dir/$name.sql",'',$_SERVER['DOCUMENT_ROOT']); Store($_SERVER['DOCUMENT_ROOT']); $arch->_close(); unlink("$backup_dir/$name.sql"); ?> |
Строго говоря, этот же скрипт будет работать и на unix платформе, но он работает медленнее и ограничений на php скрипты обычно действует больше.
А то таким образом через пару месяцев папка бекапов значительно разрастется.
В продукте есть функционал резервного копирования, но для создания резервной копии требуется участие администратора. Создание резервных копий по расписанию не предусмотрено. Недоделка? Нет, есть объективные причины, не позволяющие это сделать достаточно эффективно.
Хотя как по мне, настройка автоматического резервного копирования, например, только базы данных - очень бы пригодилась.
Так как файлы обновляются достаточно редко, в основном добавляются новости, товары.
Правда если делать восстановление только из базы, могут не подхватиться рисунки, так как мы их не сохраняем. Но при желании их можно перезалить внучрую.
А бекап файлов делать, например, раз в месяц вручную.
Это в основном полезно для случаев, когда нету доступа по SSH, и настраивать планировщик cron нет возможности. (А бывает и такое).
Если меняется имя архива, можно легко сделать удаление старых бэкапов.
Например, удаляем архивы старше недели:
заменяем строку
Есть архивы старше месяца. Выводит только когда подставляю +1 ... что я делаю не так
Вы же уже Сертифицированы как приложение под эту платформу
По теме:
Бекапить можно довольно просто - файло к примеру, паковать в zip архивы с помощью консольного архиватора, указав с помошью ключей низкий приоритет и всё прочее.
Есть и всё тот же mysqldump с его аргументами.
Можно написать cmd файл, но если заморачиваться серьёзно, то под 2008 сервером есть отличная альтернатива никсовому шелу -
Всё это хозяйство можно стартовать встроенным планировщиком и радоваться жизни.
насколько я знаю, это хозяйство стоит отдельных денег.
Подготовлю аналогичное решение на базе стандартных средств windows.
- Windows PowerShell 1.0 is released and available on the Download Center as a free download.
-Windows PowerShell is supported on Windows XP Service Pack 2, Windows Server 2003 Service Pack 1, Windows Server 2003 R2, Windows Vista, and Windows Server 2008.
Да и сами MS в качестве одной из причин перехода на платформу 2008 указывают именно её, как решение многократно превосходящее по мощности и удобству WMI, бат и cmd файлы.
Windows PowerShell
Новая оболочка командной строки, поддерживающая более 130 средств и встроенный язык программирования. Через нее администратор может без труда контролировать и безопасно автоматизировать выполнение рутинных задач по управлению системами, особенно на нескольких серверах. Оболочка Windows PowerShell не требует миграции существующих сценариев и идеально подходит для автоматизации новых функций Windows Server 2008. Благодаря новому языку написания сценариев, единообразному синтаксису и служебным программам оболочка Windows PowerShell ускоряет автоматизацию задач по управлению системами (Active Directory, сервер терминалов, Internet Information Server (IIS) 7.0 и т. д.) и позволяет учитывать уникальные особенности среды компании.
Оболочка Windows PowerShell удобна в изучении и использовании, поскольку не требует наличия навыков программирования. Кроме того, она поддерживает существующую ИТ-инфраструктуру, сценарии и средства с интерфейсом командной строки.
По крайней мере для таких как я, кто не знаком с PowerShell
А можно еще скрипт, который бы восстанавливал по расписанию базу?
Смысл такой. Стоит два сервера - основной и резервный.
Работа (заполнение журналов) происходит ежедневно утром. Скажем, до 11 часов утра.
В 11 часов cron-ом запускается резервное копирование базы (на основном сервере).
Скриптом, который вы так любезно здесь нам предложили.
Далее на резервном сервере, тоже cron-ом, запускается копирование файла архива с основного сервера - и восстановление базы на резервном.
Итого на 12 часов дня (условно говоря), мы имеем резервный сервер, полностью повторяющий основной.
Вот такой скрипт не могли бы вы еще выложить здесь?
Благодарности моей не было бы границ
Что-то пойдёт не так и сайт упадёт. Это следует делать с большой осторожностью.
Восстановить базу несложно. Замените
на
и удалите всё что ниже.
И всё же я не рекомендую это делать на живом сайте в автоматическом режиме.
Говорит, Syntax error: "(" unexpected
Это 15-я строка - function readcfg()
А простой скрипт (самый первый) работает, но требует ввода пароля (пароля нет - это локальная сеть, так что не актуально).
Денис, можно с Вами пообщаться в техподдержке? Чтобы здесь не засорять блог.
Я изменил изменил скрипт в своём посте, теперь должно работать.
Если вход в базу идёт без пароля - уберите запись
Тема поста не очень подходит для решения в техподдержке, но если возникнут непреодолимые трудности, пишите - постараюсь помочь.
Пока все понятно. Я уже примерно так и сделал.
А насчет опасности - это же резервный сервер. Даже если что-то случится - ничего страшного.
Сейчас создал два архива сайта с исключенной публичной частью, ядром и поисковым индексом.
Один - со статистикой, другой - без.
Открываю их winrar-ом, смотрю реальный размер базы.
Первый - 99 мегабайт, второй - 95.
Далее.
Делаю дамп базы с помощью приведенного здесь выше скрипта.
Как я понимаю, он включает и статистику, и поисковый индекс, да?
Так вот, его размер - 65 мег.
Как это понять? Почему архив базы с помощью средств Битрикса получается в полтора раза больше? Что еще он туда записывает?
2. mysqldump делает более компактные запросы на вставку, но суть от этого не меняется. Сравните в текстовом редакторе оба дампа и поймёте, о чём я говорю.
Говорит:
------
Extracted file '/var/www/bitrix/backup/200905140940_e0e60641.sql' have incorrect file size '' (95352559 expected). Archive may be corrupted
------
Несколько раз повторил, с разными архивами - все время одно и то же.
Это именно когда архивируешь без публичной части и ядра. Когда делаешь полный архив сайта - все нормально.
Была уже однажды такая ошибка. С полгода назад.
Правда, тогда и полный архив через раз получалось сделать.
Потом исправили.
Посмотрите, пожалуйста, в чем тут дело.
Можно ли это реализовать в данном скрипте?
И - нужно ли?
У меня, например, архив получается более 200 мегабайт. Это весь, включая публичную часть и ядро.
Ничего, что это все без перерывов молотится?
Какой вообще смысл архивирования по шагам?
В чем смысл пошаговости создания архива при использовании стандартных средств Битрикс?
15 сек, 30 сек...
Нужно ли оно вообще?
И если нужно - почему здесь это никак не используется?
Если что - заранее прошу прощения за наивные (может быть) вопросы.
При вызове из консоли совсем другая ситуация.
Нельзя ли обеспечить совместимость этого скрипта со стандартным restore.php ?
Сейчас такое ощущение, что он собственно базу (дамп) не видит в этом архиве. Не извлекает ее вообще никуда. Хотя она там есть.
А хотелось бы, чтобы извлекал, как обычно, в /bitrix/backup/
Но в папку var/www/bitrix/backup/ от корня сайта.
То есть, в /var/www/var/www/bitrix/backup/
Почему-то именно так стандартный restore.php воспринимает этот архив.
Можно что-нибудь подправить, чтобы tar его затаривал понятно для restore.php ?
Как поведет себя mysqldump, если в базе есть битые таблицы?
Не получится ли так, что он сделает дамп с этими ошибками - и потом их же восстановит?
Может, имеет смысл перед дампом базы проверить ее на предмет ошибок - и исправить их, если они есть?
Достаточно ли для этого поставить перед командой mysqldump что-то типа такого:
Или как более правильно это сделать?
Из битых таблиц битый дам не будет - это точно.
Если есть проблема с битыми таблицами - лучше использовать InnoDB вместо MyIsam.
Попробовал использовать у себя на сайте - почему-то не работает из-под крона.
В crontab находится такая строка:
Если запускать эту командную строку вручную, все отлично работает. Но из-под крона не отрабатывает и файл backup_log.txt не создается. Как вообще можно отдебажить подобные вещи?
Посмотрите системный лог, cron туда пишет информацию о своих заданиях.
Внешне строка выглядит нормально.
А crond вообще запущен? Бывают ситуации когда при выключенном свопе crond вытесняется другими процессами.
Пока не совсем понимаю, в чем вообще может быть различие между запуском одной и той же командной строки по SSH и через cron. Может, пользователи отличаются, не знаю.
Системный лог посмотрю, спасибо.
Я точно не уверен, может, и есть различия в bsd и linux, но в линуксе (конкретно, убунту), шестым параметром (после звездочек) ставится имя пользователя, от имени которого запускается этот скрипт...
Иначе (при вызове crontab -e) - под пользователем, под которым выполнена команда.
В этом случае различие от консоли будет в путях для запуска по умолчанию: тогда в crontab лучше указывать полные пути к командам.
Исправил строку в crontab на
т.е. экранировал символ % с помощью \ и все заработало. Проверьте, работает ли ваша версия ротации имен архивов с помощью даты. По идее, должна быть такая же ошибка.
Я настроил этот скрипт на каждый день, сливаю архив через три дня себе на комп.
Но в архиве не вижу нигде бэкапа Базы данных, который делается этим кодом:
Скрипт возвращает следующее:
tar: Removing leading `/' from member names OK
?
Должен быть из-за:
файла базы данных нету в бэкапе.
что нетак?
Сейчас backup.sh выглядит так:
/home/<my_root>/public_html/backitup_20100707.sql
что не так?
Вопрос остается открытым на тему backup базы MySQL средствами PowerShell в win2k8r2 x64.
Есть ли инструкция пошаговая по выполнению ежедневного backup? Объясню в чем дело: у нас как веб сервер используется IIS 7.5 а не apache.
И еще хотелось бы узнать, возможно ли сделать репликацию портала на другой портал уже развернутый, который крутится на VmBitrix?
grep $dbconn | sed 's/.*"\(.*\)".*/\1/' и никаких сообщений не дает. Можно поподробнее про эту команду?
Строка должна иметь вид
Еще вопрос: в папке bitrix есть еще managed_cache и stack_cache
Их нужно включать в архив или можно тоже выкинуть?
А вопрос про папки bitrix/managed_cache и bitrix/stack_cache
меня мучает вопрос на тему того как сделать первое backup.
1. Стандартная схема LAMP, все работает. Это хорошо, но руководство требует именно на win2k8 r2 и IIS7.5(без апача.)
2. Есть ли возможность сделать автоматический backup в заданное время суток по средствам битрикса, или php ный скрипт который будет выполнятся в заданное время суток, и делать backup.Если есть такая возможность то раскажите как?
3. Тут писали про powershell так я понимаю что можно сделать скрипт для powershell?
Если можно то поделитесь опытом.
Вы можете использовать предложенный в посте скрипт на PHP. Сделайте простой bat файл, который будет выполнять:
Добавьте выполнение скрипта в планировщик Windows чтобы он работал в автоматическом режиме.
при выполнения скрипта вылазит ошибка
mysqldump: Got error: 1016: Can't open file: './bitrix_enu/b_sec_filter_mask.frm' (errno: 24) when using LOCK TABLES
Error
что посоветуете?
Файл дампа базы должен быть в архиве, в директории /bitrix/backup.
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
Если их стереть из дампа, то восстановление проходит без ошибок.
При бэкапе вручную такого нет.
Использую Ваш скрипт для архивации КП под windows. Архив успешно создается. Для восстановления кладу его в каталог www вместе с restore.php и запускаю процесс развертывания. В папке Bitrix/backup появляется файл backup.sql но восстановление базы не прроисходит. Что я делаю не так???
И сам отвечаю только нужно поставить yum install ftp
Добавляем в cron чтобы запускал наш скрип в 2 часа ночи )
ftp.sh
#!/bin/bash
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-`date +\%H-\%d\%m\%Y`
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=bitrix/backup
if [ ! -e $doc_root/$backup_dir ]; then
mkdir $doc_root/$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 --exclude='*bitrix/backup/*.tar' --exclude='*bitrix/tmp/*' --exclude='*bitrix/updates/*' --exclude='*bitrix/*cache/*' . &&
gzip -f -9 $backup_dir/$name.tar &&
rm $backup_dir/$name.sql &&
echo OK && exit
echo Error
cd /home/bitrix/www
tar -cvpzf $filebackup * .??*
mysqldump: Got error: 1045: Access denied for user 'bitrix'@'localhost' (using password: YES) when trying to connect
Error
Скрипт запускал и root'ом и bitrix'ом. В чём может быть причина этой ошибка?
Либо, что лучше, отредактируйте привилегии администрирования для пользователя БД.
Как побороть?