Иногда при проведении резервного копирования, бэкапов, не требуется вся мощь систем уровня предприятия,
таких как, например, Bacula. Но, с другой строны, не совсем подходят и простые самописные скрипты.
Как всегда, требуется что-то среднее.Вот тут-то и следует обратить внимание на rdiff-backup (http://www.nongnu.org/rdiff-backup/).
rdiff-backup - это кучка скриптов на питоне, которые хранят историю файлов, сохраняя на диске только их отличия.
rdiff-backup бэкапит один каталог в другой. Целевой каталог в результате содержит
копию исходного каталога. Различия текущей и предыдущей копий исходного каталога сохраняются
в отдельном месте, поэтому можно восстановить и удаленные файлы. rdiff-backup может
также работать через конвейер с ограничением полосы пропускания, подобно rsync.
Вы можете использовать rdiff-backup и ssh для безопасного копирования данных на удаленную систему,
причем передаваться будут только различия. Система корректно работает с символическими ссылками,
файлами устройств, правами и т.д. и может быть использована для копирования всей файловой системы.
На сервере-хранилище-бэкапов и всех серверах, учавствующих в резервном копировании необходимо установить rdiff-backup.
Авторизацию для ssh делаем с помощью AuthorizedKeysFile.
Если на хосте-хранилище-бэкапов используется нестандартный порт для ssh,
то на хосте откуда бэкапим (клиенте) делаем файл ~/.ssh/config
Host host.tld
Port 3333
Protocol 2
Compression yes
Пример скрипта
Скрипт бэкапит базу MySQL и каталоги виртуальных хостов с клиента (client.tld) на сервер бэкапов (host.tld).
Чтобы быстро находить нужный бэкап, на хосте-хранилище-бэкапов создаются каталоги
по именам хостов-клиентов и далее уже в каждом из них хранится дерево каталогов, как и в оригинале.
#!/bin/sh
TMPDIR="/tmp/mysqldump"
DUMPFILE="${TMPDIR}/client.tld.mysqldump"
echo -e "\nmysqldump start...\n"
mkdir "${TMPDIR}"
/usr/bin/mysqldump --single-transaction --quick --skip-extended-insert \
-uUSER -pPASSWORD NAMEDB > "${DUMPFILE}"
/usr/bin/rdiff-backup --print-statistics "${TMPDIR}" \
user@host.tld::"client.tld/mysqldump"
rm -f "${DUMPFILE}"
rmdir --ignore-fail-on-non-empty "${TMPDIR}"
echo -e "\n\nstart /var/www/vhosts backup ...\n"
/usr/bin/rdiff-backup --create-full-path --exclude-symbolic-links --exclude-sockets \
--exclude-special-files --exclude-fifos --exclude-device-files --no-hard-links \
--print-statistics \
"/var/www/vhosts" user@host.tld::"client.tld/var/www/vhosts"
В cron'е можно изобразить что-нибудь типа:
/root/bin/mybackup.sh | \
/bin/mail -c "admin@domain.com" -s "`uname -n` backup report" root@localhost
Вы будете получать примерно такие отчеты:
--------------[ Session statistics ]---------
StartTime 1227924257.00 (Sat Nov 29 02:04:17 2008)
EndTime 1227924381.73 (Sat Nov 29 02:06:21 2008)
ElapsedTime 124.73 (2 minutes 4.73 seconds)
SourceFiles 2883
SourceFileSize 31441627 (30.0 MB)
MirrorFiles 2883
MirrorFileSize 31441627 (30.0 MB)
NewFiles 0
NewFileSize 0 (0 bytes)
DeletedFiles 0
DeletedFileSize 0 (0 bytes)
ChangedFiles 0
ChangedSourceSize 0 (0 bytes)
ChangedMirrorSize 0 (0 bytes)
IncrementFiles 0
IncrementFileSize 0 (0 bytes)
TotalDestinationSizeChange 0 (0 bytes)
Errors 0
Восстановление
Если что-то случится с rdiff-backup, то восстановить данные можно простым копированием, и это важно.
Пример стандартной команды для восстановления (где host.tld - хост-хранилище-бэкапов) :
rdiff-backup -r now user@host.tld::"client.tld/var/www/vhosts" /tmp/vhosts
Восстановление файлов в состоянии как 10 дней назад :
rdiff-backup -r 10D user@host.tld::"client.tld/var/www/vhosts" /tmp/vhosts
см. также секцию TIME FORMATS в man.
Дополнительно
Существует RdiffWeb для web-доступа к резервным копиям, сделанным утилитой rdiff-backup.
Дополнение от редактора:
При использовании стандартного rsynx, для отдельного сохранения изменений накопившихся за день
в отдельной директории, можно использовать примерно такой скрипт:
snapshot_dir="/snapshot/backup_snap/`date \+\%Y_\%m_\%d`"
mkdir $snapshot_dir
/usr/local/bin/rsync -a -v --delete --max-delete=1000 --hard-links \
--delete-excluded --exclude-from=/etc/rsync_backup.exclude / /backup \
--backup --backup-dir=$snapshot_dir
В /etc/rsync_backup.exclude добавляем список исключений ( в конце "/*" чтобы директория создалась):
/backup/*
/snapshot/*
/mnt/*
/var/log/*
/proc/*
... и т.п.
Для чистки снапшотов старее 30 дней, в cron добавляем:
find /snapshot/backup_snap/ -type d -maxdepth 1 -mtime +30 -exec rm -rf {} \;
URL: http://sysadminonline.ru/rdiff-backup-howto/
Обсуждается: http://www.opennet.dev/tips/info/1857.shtml