Смоленск.Me

Блог законченного пессимиста и неисправимого оптимиста

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

После того, как ты добьешься стабильной работы своего сервера, следующим шагом будет мысль о том, как данную работу сохранить. И тут может спасти 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 (индивидуально для каждого пользователя) мы запускаем данный файл-оболочку.

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

18 комментарев

  1. avatar
    #1 | shawty | 27.03.2010 в 12:20:56

    После всех вышеупомянутых операций лучше перезапустить cron: /etc/rc.d/cron restart

    Чтобы посмотреть, какие задачи запущены: crontab -l

  2. #2 | Evgen | 16.07.2010 в 16:21:37

    При использовании утилиты mysqldump нужно останавливать сервер?

  3. avatar
    #3 | shawty | 02.08.2010 в 23:18:33

    Нет, базы ведь копируются. Никаких изменений в их структуру не вносится

  4. #4 | Евгений | 13.08.2010 в 14:17:01

    Ай молодец, как раз то что нужно и без лишнего мусора.

    Сердечное спасибо!

    И еще вопросик, может не совсем в тему, но тоже про автоматизацию по расписанию:

    необходимо чтоб запускался php скрипт и стягивал данные, ну допустим какой нибудь сайт постранично.

    Запустить php скрипт не проблемма, но вот что делать если страниц много и работа скрипта затягивается на несколько часов, как перезапускать скрипт для выполнения работы небольшими порциями (по страничке)? Можно сделать чтоб php скрипт запускал сам себя до достижения какого нибудь результата?

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

  5. avatar
    #5 | shawty | 21.08.2010 в 23:48:35
    Запустить php скрипт не проблемма, но вот что делать если страниц много и работа скрипта затягивается на несколько часов, как перезапускать скрипт для выполнения работы небольшими порциями (по страничке)? Можно сделать чтоб php скрипт запускал сам себя до достижения какого нибудь результата?

    Попробуйте поправить сам запускаемый скрипт. Стандартными средствами оси тут вряд ли получится обойтись.

  6. #6 | Fantom | 26.08.2010 в 16:39:31

    С какого рожна статья "Backup на FreeBSD c помощью cron"? Она должна называться "Backup баз данных MySQL c помощью cron".

    И "mysqldump" это не "специальная стандартная утилита FreeBSD", а утилита MySQL.

  7. avatar
    #7 | shawty | 03.09.2010 в 21:00:11
    С какого рожна статья "Backup на FreeBSD c помощью cron"? Она должна называться "Backup баз данных MySQL c помощью cron".
    И "mysqldump" это не "специальная стандартная утилита FreeBSD", а утилита MySQL.

    Ха, спасибо за столь тонкое и весомое уточнение

  8. #8 | Аноним | 15.10.2010 в 00:22:58

    2 Евгений: В конце строки 0 00 * * * * www php -f /path/to/script поставь символ &

  9. avatar
    #9 | terrible | 25.04.2011 в 07:11:09

    Молодец, отличная статья. Мне нужно было просто папки бэкапить, быза 1С-ки, пару лишних строк в вышеописанном скрипте убрать и готово. Еще раз спасибо :)

  10. #10 | nemoy | 08.06.2011 в 17:57:41

    Подскажите пожалуйста а что можно в этом скрипте поправить чтоб на сервере хранилось хотя бы 2-е последних резервных копии

  11. avatar
    #11 | shawty | 08.06.2011 в 20:08:27

    В способе, описанном в статье, у тебя хранятся 7 последних копий. Надо, чтобы было именно 2?

  12. #12 | NightElf | 11.11.2011 в 11:30:33

    Спасибо, то что нужно, единственное я бы поправил вот тут:

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

    если сделать файлик со скриптом исполняемым, то /bin/sh не нужен (chmod -x )

  13. #13 | NightElf | 11.11.2011 в 11:33:24

    Поправлюсь chmod +x имя_файла

  14. avatar
    #14 | shawty | 15.11.2011 в 11:02:35

    Статья давно писалась. Да, только немного все же иначе

    chmod +x путь_к_файлу

  15. avatar
    #15 | serzhinio | 23.11.2011 в 21:05:45

    кодировку по умолчанию кладет утф - как поменять на cp1251

  16. avatar
    #16 | serzhinio | 23.11.2011 в 21:17:05

    при выполнении дает следующее..

    tar: Removing leading '/' from member names

    tar: home/sagman/backup/bases/2011-11-23bases.tgz: Can't add archive to itself

    так и должно быть?

    в принципе резервная копия создается

  17. avatar
    #17 | shawty | 24.11.2011 в 17:30:02

    Можно полностью на скрипты посмотреть? Что-то неверно делаете.

    База у вас в какой кодировке? Или какая кодировка имеется ввиду?

  18. avatar
    #18 | serzhinio | 25.11.2011 в 01:01:52

    в общем для вывода базы в нужной кодировке можно использовать следующий вариант

    /usr/local/bin/mysqldump --default-character-set=cp1251

    tar заработал без ошибок с ключем P

    tar czfP /....

Оставьте комментарий!


(обязательно)