Вы все еще не делаете backup? Я предлагаю вам довольно эффективный способ делать бэкапы — rsync+crontab. Главным преимуществом данного метода перед обычным копированием (cp) — скорость работы, т.к. копируются не все файлы, а только те, которые были изменены после предварительного бэкапа.
Для начала я смонтировал второй HDD в папку /backup, но можно копировать и на этот же жиск, но тогда какой смысл от бэкапов?
Выполняем команду:
sudo rsync -var --delete --stats /home /backup
После выполнения данной команды, в каталоге /backup появится каталог /home со всем его содержимым.
А теперь подробнее:
Параметр -v: просмотр хода работы.
Параметр -a: указывает на то, что необходимо сохранить все атрибуты файлов.
Параметр -r: двигаться по каталогам рекурсивно.
Параметр —delete: файлы которые были удалены в источнике, будут удалены и в приемнике.
Параметр —stats: выводит подробную статистику по окончанию работы.
/home — каталог источник.
/backup — каталог приемник.
Теперь, для того чтобы «все делалось само» создадим скрипт примерно следующего содержания:
#!/bin/bash
#/home:
rsync -ar --delete /home /backup
# /var/www:
rsync -ar --delete /var/www /backup
И занесем его в кронтаб:
# m h dom mon dow command
00 05 * * * /backup/rsync.backup
Еще один вариант бэкапа (предложил devilben):
отдельный диск примонтирован в /data, в /data следующая структура:
/data/backup/scripts — скрипты /data/backup/sql — для бэкапов БД /data/backup/sync — куда rsync будет синхронизировать данные /data/backup/pack — для упакованных бэкапов
сам скрипт для rsync:
#!/bin/bash
# это на случай если скрипт понадобится усложнить
BACKDIR="/data/backup"
# пишем лог выполнения синхронизации
LOG="/var/log/backup/sync.log"
echo "[`date +%F-%T`] View a list of folders for data synchronization." >> $LOG
cat "$BACKDIR/scripts/synclist.conf" | while read line;
do
if [ ${#line} != 0 ]
then #синхронизируем...
rsync -ar --delete $line
fi
echo "[`date +%F-%T`] Synchronization data $line ." >> $LOG
done
echo "[`date +%F-%T`] Completed ." >> $LOG
какие папки синхронизировать, перечисляем в synclist.conf, например:
/etc /data/backup/sync /var/www /data/backup/sync
скрипт по крону запускается каждый час.
Упаковка в отдельную папку и ротация:
#!/bin/bash
# где лежат бэкапы которые синхронит rsync
DIR="/data/backup/sync"
# где будем хранить архивы
PACKDIR="/data/backup/pack"
# форматируем дату
DATE=`date +%F`
# пишем лог
LOG="/var/log/backup/packing.log"
# идем в папку с бекапами, и переносим их в другую папку пакуя на лету
cd $DIR
echo "[`date +%F-%T`] Packaging catalog '/WWW'." >> $LOG
tar -c www | bzip2 > $PACKDIR/$DATE.www.tar.bz2
echo "[`date +%F-%T`] Packaging catalog '/etc'." >> $LOG
tar -c etc | bzip2 > $PACKDIR/$DATE.etc.tar.bz2
# проверяем на наличие архивов старше недели и удаляем, если такие имеются
echo "[`date +%F-%T`] Removal of old backups ." >> $LOG
find $PACKDIR -mtime +6 -delete
скрипт для упаковки запускается каждые сутки
скрипт бэкапа БД все в одном:
#!/bin/bash
# пользователь mysql с правами select и lock
USR="backuper"
# его пароль
PASSWD="password"
#мыло на которое слать бэкап
MAILTO=forbackups@gmail.com
# путь к бэкапам что бы сто раз не писать вдруг чё
BACKDIR="/data/backup"
# форматируем дату
DATE=`date +%F_%H.%M`
# пишем лог
LOG="/var/log/backup/mysql.log"
# создаем временную папку, переходим в нее, пишем лог
echo "[`date +%F-%T`] Create a temporary folder." >> $LOG
mkdir $BACKDIR/sql/$DATE
cd $BACKDIR/sql/$DATE
##
# читаем файлик dumplist.conf в который кстати пишем название баз которые нужно дампить,
# (каждая база пишется с новой строчки) и собственно кладем что получили во временную папку
##
echo "[`date +%F-%T`] Reading the list of databases in a dump." >> $LOG
cat "$BACKDIR/scripts/dumplist.conf" | while read line;
do
if [ ${#line} != 0 ]
then
mysqldump -u$USR -p$PASSWD $line > "$line.sql"
fi
echo "[`date +%F-%T`] Dump database $line." >> $LOG
done
# перешли в каталог на уровень выше
cd ..
# упаковываем и обзываем в виде даты создания полученное содержимое
echo "[`date +%F-%T`] Packing resulting backup." >> $LOG
tar -c $DATE | bzip2 > $DATE.tar.bz2
# удаляем папку так как зачем нам папка если есть теперь архив
echo "[`date +%F-%T`] Remove the temporary folder." >> $LOG
rm -rf $DATE
# отправляем на почту копию
echo "[`date +%F-%T`] Sending a copy to $MAILTO ." >> $LOG
mpack -s "$DATE.tar.bz2" -c application/octet-stream $BACKDIR/sql/$DATE.tar.bz2 $MAILTO
# проверяем на наличие олдфагов, все что старше недельной давности удаляется
echo "[`date +%F-%T`] Removal of old backups ." >> $LOG
find $BACKDIR/sql -mtime +6 -delete
echo "[`date +%F-%T`] Completed ." >> $LOG
для отправки на почту нужно установить mpack, настраивать ничего не нужно, скрипт бэкапа БД, например, запускается пять раз в сутки.
Для бэкапа mysql необходимо создать юзера с правами lock tables.
Для создания из консоли необходимо ввести:
$ mysql -pПАРОЛЬ
mysql> CREATE USER ‘backuper’@'localhost’ IDENTIFIED BY ’password';
mysql> GRANT SELECT , LOCK TABLES ON * . * TO ‘backuper’@'localhost’ IDENTIFIED BY ’password';
либо через phpmyadmin