rsync и локальный бэкап сайтов на сервере
Все нижеописанное актуально для FreeBSD (в частности используется на FreeBSD 9.2-RELEASE). Вообще-то rsync конечно же дает прекрасные инструменты для удаленного архивирования по сети. Но... Для начала неплохо иметь копии локально, за N дней. На случай сбоя, какой-то правки неправильной и т.п. Для mysql (почему-то это не так часто описано) при установке из портов нужный скрипт создается и остается лишь включить его выполнение в periodic daily и настроить параметры. Для этого в файл /etc/periodic.conf нужно внести такие строки ( на "чистой" установке ОС этого файла нет вообще, в таком случае его нужно создать и занести туда нужные строки ):
# vim /etc/periodic.conf
mysqlbackup_enable="YES"
mysqlbackup_args="-a -u root -l 5 -z bzip2"
Эти инструкции делают ежедневный бэкап всех баз данных mysql в папку /var/backups/mysql/. Архивы хранятся за 5 дней и sql файлы упаковываются в bzip2. Ежедневный архив всех баз удобно расположен в папке с именем YYYYMMDD (например 20140604 для 4-го июня 2014 года). Для того, чтобы скрипт смог отработать нужно еще создать файл /root/.my.cnf в котором указать пароль для пользователя root в mysql в виде:
# vim /root/.my.cnf
[mysql]
user=root
password=root_password_for_mysql
[client]
user=root
password=root_password_for_mysql
Еще мне хотелось иметь архивы сайтов, т.к. иногда находит "порукоблудить" и не всегда сразу заметишь, что чего-то напортачил. И когда через день-два это все всплывает - начинаешь мучительно вспоминать какие строки и где менял. Сначала я просто архивировал (опять же через periodic daily) папкис сайтами и хранил N, а иногда и M (шутка) дней. Но архивирование очень сильно поглощает процессор - задача непростая. К тому же большинство сайтов основной свой объем имеют за счет картинок, архивов и т.п. (тексты в основном в БД, остаются скрипты, но их не так много по объему) - т.е. вещей в принципе не жмущихся архиватором. Следовательно проще просто копировать файлы. Но зачем копировать все, если за день меняется от силы 10% содержимого сайта? Вот для этого и предназначен rsync - сравнить содержимое и привести к единому виду. Установка rsync из портов проста и понятна, останавливаться на этом нет смысла. Для задач локального архивирования демон rsyncd нам запускать не нужно и никаких дополнительных настроек делать тоже. Создаем папку, куда будем складывать архивы (например /var/backups/www/). Для того, чтобы скрипт выполнялся при запуске periodic daily (каждую ночь) создаем его сразу в папке /usr/local/etc/periodic/dayli/. Основная "хитрость" состоит в том, чтобы опять же не делать каждый день новую копию с помощью rsync, а переименовать устаревшую папку в новую и и синхронизировать (даже за 5-7 дней изменений то не так много). Собственно сам скрипт с пояснениями:
# vim /usr/local/etc/periodic/daily/499.backup_sites.sh
#!/bin/sh
### В переменную is_now мы помещаем
### имя папки для сегодняшнего дня
is_now=`date +"%Y%m%d"`
### В переменную is_exp мы помещаем
### имя папки для устаревшего архива
### (в данном случае храним архивы за 5 дней)
is_exp=`date -v-5d +"%Y%m%d"`
### Сначала проверяем существует ли "устаревшая" папка...
if [ -d /var/backups/www/$is_exp ] ; then
###...если ДА -
### переименовываем "устаревшую" папку в "актуальную"
/bin/mv /var/backups/www/$is_exp /var/backups/www/$is_now
else
###...если НЕТ -
### просто создаем "актуальную" папку
/bin/mkdir /var/backups/www/$is_now
fi
### С помощью rsync полностью синхронизируем
### (с удалением отсутствующих файлов)
### содержимое папки с сайтами (/usr/home/www/)
### в "актуальную" папку
/usr/local/bin/rsync -a -delete /usr/home/www/ /var/backups/www/$is_now/
Не забываем сделать скрипт исполняемым:
# chmod u+x /usr/local/etc/periodic/daily/499.backup_sites.sh
Все. Теперь каждую ночь при запуске periodic daily мы будем обновлять наш архив сайтов за N дней.
Потом я еще добавил по такому же принципу в этот файл архивирование папок с конфигурацией системы (/etc и /usr/local/etc).