Меню подраздела

Проголосуй за статьи!

Нужны эти статьи кому-нибудь вообще?

Бесплатный курс по webAsyst Shop-Script 4

Бесплатный курс по webAsyst 4

Корректор оЧепяток

Если Вы заметили в тексте опечатку, то, пожалуйста, сообщите мне об этом выделив ошибочное слово и нажав Shift + Enter

packageСегодня я буду рассказывать свой опыт в архивировании файлов и базы данных MySQL (дальше я её буду называть просто БД) на сервере (на хостинге). Я почему-то не стал ждать когда сайт навернётся первый раз, а потом думать как это всё восстановить. Предусмотрительность - большое благо и реальная экономия вашего драгоценного времени.

Поэтому будем всё бэкапить сразу, причем тотально. :)

В Joomla конечно есть свои системы резервирования типа JoomlaPack, но многие признают, что все они не очень надежны. Поэтому мы будет заниматься бэкапом файлов и БД средствами операционной системы сервера, и в частности с помощью команд для linux систем, которые будем запускать через cron. Есть еще один способ запуска команд - через сценарий какой-либо оболочки, типа sh, но думаю это будет сложновато для обычного сайтовода, мы ведь не линуксоиды, оставим такие пути им.

Что надо сделать в первую очередь? Идем в контрольную панель своего хостинга и включаем использование крона (называется либо cron, либо crontab). У меня на хостинге есть специальная кнопочка - включить. Зачем вообще сделано так, а не включено по умолчанию? Да как раз для того, чтобы у вас имелись те 2 варианта написания команд - если используем скрипты оболочки, то крон в контрольной панели должен быть выключен, иначе задания из контрольной панели затрут задания из скрипта. Может быть на другом хостинге сделано как-то по другому, например вообще нет возможности делать скрипты и исполнять их из линуха, и тогда у вас будет крон включен по умолчанию. Хотя я знаю хостинги и тарифные планы, которые вообще не поддерживают возможность задания задач для крона, хотя они и платные. Поэтому, если вы только выбираете себе хостинг, то рекомендую не брать тарифные планы без крона.

После включения крона должна появиться форма, подобная этой:

новое задание

В этой форме есть 2 основных поля:

Поле №1 - поле для задания периодичности выполнения команд. В каждой ячейке указываются последовательно минута, час, день, месяц, день недели, когда должна быть выполнена команда, указанная в Поле №2. Допускаются перечисления (через запятую: 1,3,5), интервалы (через дефис: 1-5), шаг (после символа "/": 1-9/2 означает "1,3,5,7,9", то есть каждое второе значение из указанного диапазона). Звездочка "*" означает все допустимые значения. Для месяца и дня недели можно использовать их сокращенные английские названия (первые три буквы), например: Feb, JUN, tue, Fri (регистр значения не имеет). Диапазоны и перечисления для имен недопустимы, то есть по имени можно обозначить только один месяц или день недели. Для числового обозначения дней недели допустимыми являются числа 0-7, где как 0, так и 7 обозначают воскресенье. Несколько примеров:
Пример 1. Запускать команду каждый вторник в полдень:

Пример 1

Пример 2. Выполнять команду через день в январе, марте и с сентября по декабрь:

Пример 2

Пример 3. Запускать команду 1-го и 15-го числа каждого месяца в 2:05, а также по воскресеньям (поля "день месяца" и "день недели" работают в режиме ИЛИ):

Пример 3

Со временем определились. Посмотрим что за команды могут быть в Поле №2. Поле "команда" определяет команду (имя скрипта) для запуска. Если скрипт написан на PHP, то в большинстве случаев нужно будет предварить сам скрипт вызовом интерпретатора, например так:

php /mysite/myscript.php

Возможен и вариант с вызовом PHP скрипта из браузера, тогда команда должна иметь такой вид:

lynx --dump http://www.domain.ru/myscript.php >/dev/null

Для скрипта на Perl, если он является исполняемым файлом, то есть начинается с #!/usr/bin/perl и бит исполнения установлен, указывать интерпретатор не надо. Это же относится к shell-скриптам. Мы же будем указывать не файл скрипта, а прямо команду shell, для этого не надо никаких заморочек с правами доступа к файлам и прописывания каких-либо префиксов перед командой. Самый простой вариант.

Перед попытками использования команд вам необходимо выяснить полный физический путь к папке на вашем сайте на сервере, в которую будете делать бэкап. Сделать это достаточно просто - создаете php файл такого содержания:

  1. <?php
  2. $basedir = getcwd();
  3. $basedir = str_replace('\\','/',$basedir);
  4. echo "<br /><div style='text-align:center'>Current dir: ".$basedir."</div>";
  5. ?>

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

Итак, первое, что нам надо сделать - это забэкапить все базы данных в один файл. Я сразу напишу команду, а потом объясню все параметры.

/usr/local/bin/mysqldump --all-databases --databases -u LOGIN -h HOST -pPASS | /usr/bin/gzip -c
 > /mysite/backup/alldbdump.sql.gz

Здесь /usr/local/bin/mysqldump - вызов программы mysqldump, которая и занимается выгрузкой БД MySQL в текстовый файл (получается скрипт, который можно выполнить в SQL запросе и он восстановить все данные из базы как это было на момент резервирования. К файлу mysqldump лучше указывать полный путь, так как не всегда этот путь есть в переменной path сервера. Чаще всего он лежит именно в папке /usr/local/bin/, но если у вас вдруг создается файл, но он если его разархивировать нулевого размера, значит программа mysqldump находится по какому-то другому пути - у вас два варианта: попробовать написать mysqldump без указания пути (достаточно часто срабатывает) или обратиться в техподдержку своего хостинга и узнать точный путь до программы.

У mysqldump есть ключи, которые я сейчас расшифрую:

  • Ключ --all-databases позволяет сделать копии всех баз данных, которые существуют на данном MySQL-сервере. Если же нужно сделать копии только некоторых баз, нужно просто указать их через пробел при вызове mysqldump из командной строки (в нашем случае - перечислить после ключа -p).
  • Ключ --databases позволяет сделать так, что mysqldump включит в сценарий восстановления команды CREATE DATABASE /*!33333 IF NOT EXISTS*/ DBNAME и USE DBNAME. Это позволит создавать рабочие базы "с нуля". То есть, без использования --databases подразумевается, что пользователь восстанавливает одну базу данных и явно указывает, куда нужно помещать восстанавливаемые данные. Если же бэкап создается с целью сделать полностью рабочую копию данных, например, на другом MySQL-сервере, то нужно использовать этот ключ.
  • Ключ -u указывает какой логин подставлять при подключении к БД. После ключа перед логином стоит пробел.
  • Ключ -h указывает к какому хосту подключаться. Здесь желательно указывать IP-адрес сервера БД, он может не совпадать с адресом сервера на котором размещены файлы сайта. После ключа перед хостом стоит пробел.
  • Ключ -p указывает какой пароль подставлять при подключении к БД. После ключа перед паролем НЕТ пробела, это существенное замечание.

Дальше в нашей команде идёт конструкция " | /usr/bin/gzip -c" - она означает, что полученный с помощью mysqldump дамп надо передать программе gzip, которая его заархивирует. Очень рекомендую использовать архиватор, так как простые текстовые файлы очень сильно сжимаются и вы получите реальную экономию и места на дисках и времени перекачки файлов с сервера на локальную машину для хранения. Ключ -c указывает программе gzip, что надо создать новый архив. Вроде больше тут объяснять нечего.

Дальше идёт конструкция " > /mysite/backup/alldbdump.sql.gz", которая перенаправляет результат работы программы gzip в файл с названием alldbdump.sql.gz и помещает этот файл в папку /mysite/backup/. Если вы не пользуетесь архиватором gzip, то расширение файла оставьте только .sql.

Восстановиться потом из резервной копии БД можно или через PhpMyAdmin на хостинге, или используя какой-нить другой софт или скрипт контрольной панели хостинга, или через командную строку оболочки, используя программу mysql. Вариантов масса.

Ну вот, БД забэкапили, можно переходить к бэкапу файлов сайта. Я делаю следующим образом - полный бэкап файлов ежемесячно, облегчённый бэкап еженедельно. Облегченный бэкап у меня не содержит тяжелых мультимедиа файлов, которые крайне редко меняются, типа avi, flv, zip, rar, doc, exe, pdf, mp3 и т.п. Как делать бэкап файлов на примере облегченного бэкапа (в полном не будет ключей exclude):

tar -czf /mysite/backup/backupsite.tar.gz --exclude=*.zip --exclude=*.rar /mysite/folder1/*
 /mysite/folder2/*.txt

Команда простая и имеет вызов всего одной программы - архиватора tar. У меня есть хорошая инструкция по этому архиватору, но она занимает 230 страниц и написана на английском языке. Поэтому вкратце объясню что зачем:

  • Ключ -c (полностью --create) - указывает, что надо создать архив, а не добавить в архив или извлечь из него.
  • Ключ -z (полностью --gzip) - указывает, что будет использоваться сжатие gzip (можно ведь просто упаковать всё в один файл без сжатия данных или использовать bzip2, XZarchive, LZMA или LSOP сжатие).
  • Ключ -f (полностью --file) - указывает, что будет создан файл, путь и имя файла указываются сразу за этим ключом - у нас это /mysite/backup/backupsite.tar.gz.
  • Ключ --exclude указывает какие файлы (папки) надо исключить из обработки. В этом примере мы исключаем все файлы с расширением zip и rar. Для описания файлов могут использоваться стандартные почти для всех операционных систем маски.
  • Ну и в конце строки через пробел перечисляются папки (файлы) для архивирования. В нашем примере архивируются все файлы из папки /mysite/folder1/ и все текстовые файлы из папки /mysite/folder2/.

Ну вот, БД и файлы мы сейчас можем автоматически архивировать на сервере. А вдруг что-то случится с датацентром хостинговой компании или с нашим конкретным сервером, на котором лежит сайт? Надо эти архивы перетащить к себе на компьютер (рабочий или домашний) и хранить еще и там. В этом случае даже если сгорит винт нашего сервера мы всегда за 15 минут сможем восстановить наш сайт на любом другом сервере.

Как перетаскивать файлы решать вам. Можно таскать вручную через FTP клиент, а можно как я, сделать полностью автоматический скрипт программой типа xStarter (русская версия совершенно бесплатная). Но это уже другая история... Если надо расписать как автоматизировать синхронизацию локальных и серверных бэкапов пишем запрос в комментах.

Удачного кодинга!

Комментарии  

 
+2 #1 Сергей 23.07.2010 13:03
Респект за статью!
 
 
0 #2 Aleks 22.12.2010 11:04
спасибо Вам! сайт просто грейтебл
 

У вас недостаточно прав для комментирования

Баннер