Backup на FreeBSD c помощью cron

27.03.2010 shawtyРазработка, Сервер, , , 19406

После того, как ты добьешься стабильной работы своего сервера, следующим шагом будет мысль о том, как данную работу сохранить. И тут может спасти raid - но это глобально. Что если у нас накрылась одна из баз, или хакеры взломали твой сайт и стерли важные файлы? Ну, пугаться не стоит, конечно =) Есть способ помочь себе самому. В FreeBSD ты найдешь все, что тебе нужно... мы справимся даже стандартными средствами. Из набора инструментов нам понадобятся: пользовательский cron, утилита mysqldump и шелл, который мы с тобой напишем.

Пару слов отступления.

cron - демон-планировщик. Запускает необходимые тебе команды от определенного пользователя с его же правами. Запуск происходит по выставленному тобой времени. Ничего сложного, сам увидишь.

mysqldump - специальная стандартная утилита FreeBSD, которая создает дамп указанной тобой базы данных. Данную тулзу мы будем запускать с помощью cron.

Прочитав вышенаписанное, можно с легкостью определить цель: нам необходимо настроить cron так, чтобы он в определенное время запускал mysqldump. Надеюсь, здесь все понятно, идем дальше.

Долго ковыряться не станем, заходим под root и командой crontab -e создаем файл, в который будет смотреть cron. Увидеть он там должен следующее:

0 4 * * * /bin/sh /backup/my.sh

разберем по пунктам:

- 0 4 * * * - здесь задается время запуска твоего шелла. Советую выбрать время суток, когда нагрузка на сервер минимальна. Я выбрал 4 утра, 0 минут. Так как дни недели нас не интересуют, то дальше оставляем * (с настройкой времени все просто, не буду подробно на этом останавливаться).

- /bin/sh - то, с помощью чего будет запускаться твой шелл. Тут все стандартно, ничего менять не требуется.

- /backup/my.sh - собственно, твой шелл. Его-то мы и запускаем. Соответственно, заранее в корне создаем папку /backup, в нее и кладем шелл-файл (называть его можешь как угодно... в моем случае это my.sh).

Что у нас должно получиться на данный момент?

- папка /backup в корне. Либо любая другая в любом другом месте - главное, указать полный путь к файлу шелла.

- в /var/cron/tabs/ у нас должен появиться файл по имени пользователя, т.е. root.

- и пока пустой шелл-файл. (я создавал текстовый файл с помощью total commander и менял расширение с .txt на .sh).

Если все это есть, то продолжаем...

Теперь перейдем к содержимому файла my.sh. Здесь должны быть прописаны непосредственно те команды, которые запускаются у нас по расписанию.

/usr/local/bin/mysqldump -uroot -pпароль имя_базы_данных > /backup/bases/`date +%Y-%m-%d`имя_файла.txt
#
tar czf /backup/bases/`date +%Y-%m-%d`bases.tgz /backup/bases
#
tar czf /backup/bases/`date +%Y-%m-%d`domains.tgz /usr/local/www/apache22/data/domains
#
find /backup -name "*.tgz" -mtime +7 -delete
#
find /backup -name "*.txt" -mtime +7 -delete
#

разберем по пунктам:

- /usr/local/bin/mysqldump - это полный путь к утилите mysqldump, обязательно указываем полный путь!

- -uroot -pпароль - ваш логин и пароль для доступа к mysql.

- имя_базы_данных - имя базы, backup которой делаем.

- /backup/bases/`date +%Y-%m-%d`имя_файла.txt - полный путь и название файла (может быть любым на твое усмотрение). То, что получишь на выходе, после выполнения команды.

- `date +%Y-%m-%d` - в имени файла будет прописано дата, от какого числа сделан backup.

- tar czf - сразу сделаем архивацию.

- tar czf /backup/bases/`date +%Y-%m-%d`bases.tgz - то, что получаем на выходе после выполнения команды архивирования (а именно, архив с датой создания в названии).

- /backup/bases - та папка, которую сжимаем архиватором.

- tar czf /backup/bases/`date +%Y-%m-%d`domains.tgz /usr/local/www/apache22/data/domains - советую кроме баз данных сразу откатывать и архивировать папки с доменами.

- find /backup -name "*.tgz" -mtime +7 -delete - находим и удаляем те файлы в формате *.tgz, которые создавались более 7 дней назад (естественно, только в папке /backup).

- find /backup -name "*.txt" -mtime +7 -delete - находим и удаляем те файлы в формате *.txt, которые создавались более 7 дней назад (естественно, только в папке /backup).

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

В принципе, если имеются вопросы, то задавайте в комментах. Постараюсь ответить на каждый.