Rsync - создать инкрементный backup
1 Лучший на данный момент способ, используя жесткие ссылки
Увидел тут.
Идея в том что-бы делать инкрементный backup используя жесткие ссылки на предыдущую копию. Тем самым объединяются достоинства и устраняются недостатки полного и обычного инкрементного backup-а
Для реализации используется ключ --link-dest= после чего указывается ссылка на предыдущую резервную копию.
Есть тонкость, если используется относительный путь, то rsync считает его из директории назначения резервного копирования. Возможно лучше использовать полный путь, что бы не путаться.
Автор рекомендует использовать следующий скрипт (чуть измененный):
#!/bin/sh # Этот скрипт создает резервную копию использую жесткие ссылки на предыдущие резервные копии # это сильно сокращает размер занимаемый резервными копиями # (размер увеличивается только на измененные/добавленные файлы) # при этом сохраняет удобство полной архивной копии # Исходная директория для резервного копирования # Если у конце пути нет "/" значит будет копироваться и сама директория # Если в конце поставить "/" то будет копироваться только содержимое SRC='/root/files' # Директория содержащая архивы BACKUP_PATH='/root/backup/' # Если эта директория не существует, создаем ее /usr/bin/mkdir -p ${BACKUP_PATH} # Суффикс имени резервной директории SUFFIX='files' # Имя создаваемой резервной директории DST=${BACKUP_PATH}${SUFFIX}'-'$(/usr/bin/date +%F_%H-%M-%S) # Имя символической ссылки на последнюю (предыдущую) резервную копию LAST=${BACKUP_PATH}'last' # Опции запуска rsync # OPT='-avHAX' # -a режим архива замена ключей -rlptgoD # -H копировать жесткие ссылки как жесткие ссылки (только в рамках одного раздела) # -A копировать атрибуты Posix ACL # -X копировать контекст SELinux # -v список файлов и короткий итог OPT='-aHAX' # Если символическая ссылка существует значит копирование уже производилось if [ -e ${LAST} ]; then # Выполняем резервное копирование # Можно использовать относительный путь до директории last # /usr/bin/rsync ${OPT} --link-dest=../last ${SRC} ${DST} # Или использовать абсолютный путь /usr/bin/rsync ${OPT} --link-dest=${LAST} ${SRC} ${DST} # Удалим ссылку last на директорию теперь уже предыдущей резервной копии /usr/bin/rm -f ${LAST} # Создадим новую символьную ссылку "last" на последнюю резервную копию /usr/bin/ln -s ${DST} ${LAST} else # Если ссылки не было, то просто выполняем полную резервную копию /usr/bin/rsync ${OPT} ${SRC} ${DST} # Создадим символьную ссылку "last" на созданную резервную копию /usr/bin/ln -s ${DST} ${LAST} fi
2
Задача: Сделать backup c с помощью rsync.
Пример создает инкрементный backup всех файлов с расширением doc, txt, xls и не имеющих расширения из директории /home в директорию /home/samba1/backup_doc/latest/ исключения составляют директории samba1, media и db находящиеся в директории /home. Старые копии изменившихся или удаленных файлов помещаются в директорию с названием формата ДЕНЬ.МЕСЯЦ.ГОД_ЧАС.МИНУТА находящуюся в директории /home/samba1/backup_doc/.
Для ограничения скорости требуется добавить ключ --bwlimit=KBPS, где KBPS-скорость в kB в секунду.
BACKUPDIR=`/bin/date +%d.%m.%y_%H.%M` /usr/local/bin/rsync -aq --include="*.doc" --include="*.txt" --include="*.xls" \ --exclude="*.*" --exclude="samba1/" --exclude="media/" --exclude="db/" --force \ --ignore-errors --delete -b --backup-dir=/home/samba1/backup_doc/$BACKUPDIR \ /home/ /home/samba1/backup_doc/latest/
3
На сервере под FreeBSD установлен WordPress, требуется делать его backup и отсылать на почту.
Необходимо создать ключи для ssh, об этом есть тут
dump.sh:
#!/bin/sh D=`date +%Y.%m.%d_%H.%M` #Делаем mysqldump с сервера /usr/bin/ssh uXXXXXX@uXXXXXX.ssh.masterhost.ru -i /home/rom/myscript/my-backup/id_dsa \ '/usr/local/bin/mysqldump --opt --force -c -h uXXXXXX.mysql.masterhost.ru --password="YYYYYYY" --user="uXXXXXX" uXXXXXX | /usr/bin/gzip' \ >/home/rom/myscript/my-backup/dump/mysql/mysqldump-${D}.sql.gz 2>/home/rom/myscript/my-backup/error.txt #Посылаем ошибку на почту если она была cat /home/rom/myscript/my-backup/error.txt | /usr/bin/awk '{printf $0}' \ | /usr/bin/awk -v t=$D '{system ("echo \""$0"\" | mail -s \"Fatal mysqldump test.ru date:"t"\" test@gmail.com")}' #Делаем dump файлов с сервера /usr/local/bin/rsync -e 'ssh -i /home/rom/myscript/my-backup/id_dsa' \ -r -l -x --force -p -t --delete -S -H \ uXXXXXX@uXXXXXX.ssh.masterhost.ru:/home/uXXXXXX/test.ru /home/rom/myscript/my-backup/dump/uXXXXXX \ -b --backup-dir=/home/rom/myscript/my-backup/dump/old/test.ru-$D/ 2>/home/rom/myscript/my-backup/error.txt #Посылаем ошибку на почту если она была cat /home/rom/myscript/my-backup/error.txt | /usr/bin/awk '{printf $0}' \ | /usr/bin/awk -v t=$D '{system ("echo \""$0"\" | mail -s \"Fatal dump test.ru date:"t"\" test@gmail.com")}' #Подготавливаем архив и режем его на части по 10Мб rm -f /home/rom/myscript/my-backup/dump/split/dump-tar.gz-split-* && \ cd /home/rom/myscript/my-backup/dump/split/ && \ /usr/bin/tar cfz - --exclude /home/rom/myscript/my-backup/dump/uXXXXXX/test.ru/www/video \ /home/rom/myscript/my-backup/dump/uXXXXXX /home/rom/myscript/my-backup/dump/mysql/mysqldump-${D}.sql.gz \ | /usr/bin/split -b 10M -a 1 - dump-tar.gz-split- 2>/home/rom/myscript/my-backup/error.txt #Посылаем ошибку на почту если она была cat /home/rom/myscript/my-backup/error.txt | /usr/bin/awk '{printf $0}' \ | /usr/bin/awk -v t=$D '{system ("echo \""$0"\" | mail -s \"Fatal split dump test.ru on mail date:"t"\" test@gmail.com")}' #Отправляем архив на почту ls /home/rom/myscript/my-backup/dump/split/dump-tar.gz-split-* \ | /usr/bin/awk '{system ("sleep 120 && /home/rom/myscript/my-backup/send_mail_backup.sh "$0)}' 2>/home/rom/myscript/my-backup/error.txt #Посылаем ошибку на почту если она была cat /home/rom/myscript/my-backup/error.txt | /usr/bin/awk '{printf $0}' \ | /usr/bin/awk -v t=$D '{system ("echo \""$0"\" | mail -s \"Fatal send dump test.ru on mail date:"t"\" test@gmail.com")}' # Удаляем архивы старше 7 дней /usr/bin/find /home/rom/myscript/my-backup/dump/mysql/ -name "*.sql.gz" -ctime +7d -delete /usr/bin/find /home/rom/myscript/my-backup/dump/old/ -depth 1 -type d -ctime +7d -delete
send_mail_backup.sh:
#!/bin/sh D=`date +%Y.%m.%d_%H.00` cat $1 |/usr/bin/uuencode ${D}_dump_test.ru-$1 \ | mail -s "Dump test.ru ${D}" backup@gmail.com -f test@gmail.com 2>/home/rom/myscript/my-backup/error.txt #Посылаем ошибку на почту если она была cat /home/rom/myscript/my-backup/error.txt | /usr/bin/awk '{printf $0}' \ | /usr/bin/awk -v t=$D '{system ("echo \""$0"\" | mail -s \"Fatal send dump test.ru on mail date:"t"\" test@gmail.com")}'