четверг, 7 октября 2010 г.

BackUp. Резервное копирование на Linux/Unix - версия 2.

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

Файл backup.sh

#!/bin/sh
MOUNTDEV=/media/backup
SCRIPTDIR=/files/scripts/backups
BKPDIR="${MOUNTDEV}/`hostname`"
MAPFILE="${SCRIPTDIR}/${1}.map"
DATEYMD=`date "+%Y-%m-%d"`
if [ -d "${SCRIPTDIR}/${1}" ]; then
ls ${SCRIPTDIR}/${1}|sort|while read RUN
do
env PARAM1=${1} MOUNTDEV=$MOUNTDEV SCRIPTDIR=$SCRIPTDIR BKPDIR=$BKPDIR MAPFILE=$MAPFILE DATEYMD=$DATEYMD "${SCRIPTDIR}$
done
fi
cat ${MAPFILE}|sort|while read BKPFILES
do
mkdir -p ${BKPDIR}/${BKPFILES} 2>/dev/null
echo -n "">>"${SCRIPTDIR}/${BKPFILES}.x"

tar -czpvf "${BKPDIR}/${BKPFILES}/${DATEYMD}-${BKPFILES}.tar.gz" --absolute-names --files-from="${SCRIPTDIR}/${BKPFILES}.bkp" --exclude-from="${SCRIPTDIR}/${BKPFILES}.x">"${BKPDIR}/${BKPFILES}/${DATEYMD}-${BKPFILES}.log" 2>"${BKPDIR}/${BKPFILES}/${DATEYMD}-${BKPFILES}.err"
done

Переменные остались старыми:
MOUNTDEV - примонтированное устройство или каталог, где будут храниться резервные копии.
SCRIPTDIR - папка со скриптом
BKPDIR - папка в которую будут складываться backup-ы (является подкаталогом MOUNTDEV для разделения бэкапов с разных серверов)
MAPFILE - файл профиля текущего backup-а (оставьте как есть).
DATEYMD - формат даты, которая добавляется к имени архива. Это сделано для удобного поиска нужного архива.

Теперь нужно сделать нужные профили для резервного копирования. Профиль будет иметь расширение ".map". Добавьте в него нужные пункты. Каждая строка - это в результате отдельный каталог с резервными копиями. Это, так сказать, категории архивов.
Например содержимое может быть таким:

Файл daily.map

configs
logs


Файл monthly.map

full


Профайлы готовы, теперь нужно подготовить списки файлов для каждой категории.
Для нашего примера нужно сделать три списка (в название файла со списком надо добавить расширение bkp).
Их содержимое может быть например таким:

файл configs.bkp

/etc
/var/my_config

logs.bkp

/var/log
/opt/mylog

full.bkp

/


Запуск резервного копирования производится с параметром, в котором указывается имя профайла.
В нашем случае это будет выглядеть примерно так:

backup.sh daily

или

backup.sh monthly


После первого запуска будут созданы файлы configs.x, logs.x и full.x (или другие для вашего варианта). Если вписать пути подкаталогов в эти файлы, то они не будут включены в архив.

Так же организован запуск скриптов из каталога с именем профайла. Я приведу несколько примеров таких скриптов:

Резервное копирование MySQL:


Создайте файл, например, mysql.sh, разрешите ему запускаться и добавьте:

#!/bin/sh
mkdir -p ${BKPDIR}/MySQL 2>/dev/null
mysqldump -uUSER -pDLINNIYPASSWORD mysql| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-mysql-MySQL.gzip"
mysqldump -uUSER -pESCHEODINPASSWORD phpmyadmin| gzip -f -9 - >"${BKPDIR}/MySQL/${DATEYMD}-phpmyadmin-MySQL.gzip"

Первая строчка создает подкаталог (если он еще не существует) в котором будут храниться резервные копии. Две другие строчки делают backup двух баз.

Резервное копирование PostgreSQL:


Создайте файл, например, postgresql.sh, разрешите ему запускаться и добавьте:


#!/bin/sh
mkdir -p ${BKPDIR}/PostgreSQL 2>/dev/null
(su - postgres -c "pg_dump postgres" <"${BKPDIR}/PostgreSQL/${DATEYMD}-postgres-PostgreSQL.gzip"
TUT_NUZNO_PISAT_PASSWORD_DLYA_BAZY
EOF


Резервное копирование MBR:


#!/bin/sh
mkdir -p ${BKPDIR}/MBR 2>/dev/null
dd if=/dev/sda of="${BKPDIR}/MBR/${DATEYMD}-sda-mbr.bin" bs=512 count=1

Для восстановления всей MBR надо запустить
dd if=sda-mbr.bin of=/dev/sdX bs=1

Для восстановления таблицы разделов нужно использовать
dd if= sda-mbr.bin of=/dev/sdX bs=1 count=64 skip=446 seek=446

Для восстановления только загрузчика запустите
dd if=sda-mbr.bin of=/dev/sdX bs=1 count=446


Скрипт (модуль) для резервного копирования файлов по маске:


#!/bin/sh
find /www -name '*.php' -or -name '*.js' -or -name '*.pl' -or -name '*.ephtml' -or -name '.htaccess' -or -name 'htpasswd' -or -name 'htgroup'>${SCRIPTDIR}/www.bkp
cat ${SCRIPTDIR}/${MAPFILE}|grep "www">/dev/null
if [ "$?" -eq 1 ]; then echo "">>${SCRIPTDIR}/${MAPFILE}; echo www>>${SCRIPTDIR}/${MAPFILE}; fi


Dump для FreeBSD:


#!/bin/sh
mkdir -p ${BKPDIR}/dump 2>/dev/null
dump -0 -L -f - / | gzip -9 > "${BKPDIR}/dump/${DATEYMD}-root.img.gz"
sleep 4
dump -0 -L -f - /usr | gzip -9 > "${BKPDIR}/dump/${DATEYMD}-usr.img.gz"
sleep 4
dump -0 -L -f - /var | gzip -9 > "${BKPDIR}/dump/${DATEYMD}-var.img.gz"


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