Practical developers (dexSoft.ru)
Домены

Рейтинг

Метки

Сервис

Обсуждения

Марс атакует!
Сгинули все инопланетяне... Надоели мы им...

Статистика

 

Статьи > BASH

Создание резервных копий баз данных и файлов в командном процессоре Bash

07 август 2012 18:47, рейтинг: 6512, автор: EloSoft

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

#!/bin/bash
echo "start `date`"
#пользователь базы данных
USER=user_name
#пароль пользователя базы данных
PASSWORD=user_password
#папка хранения бэкапов
BACKUP=/folder_backups/backup
#директория логов (нужна для чистки лишних лог-файлов)
LOG=/var/log
#время хранения бэкапов в днях
OLD=2
#префикс для имен создаваемых файлов
PREFIX=myprefix
#дата (подставляется в имена создаваемых файлов для уникальности и наглядности)
DATE=`eval date +%Y-%m-%d`
#создание бекапа баз данных
echo "Backup database to $BACKUP"
mkdir -p $BACKUP
cd $BACKUP
for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
    do mysqldump -u $USER -p$PASSWORD \
        --add-locks \
        --ignore-table=$i.table1 \
        --ignore-table=$i.table2 \
    $i > $DATE-$i.sql; 
done
cd ..
tar -cjf $BACKUP/$DATE-sql-$PREFIX.tar.bz2 ./$DATE.sql
#удаляем временный файл
rm -rf ./$DATE.sql
#создание бекапа файлов
echo "Backup files to $BACKUP"
tar -cpPjf $BACKUP/$DATE-files-$PREFIX.tar.bz2 \
    --exclude=$BACKUP* \
    --exclude=*/tmp* \
    --exclude=*/log* \
    /myfolder1 \
    /myfolder2 \
    /myfolder3/subfolder
#пауза для более правильного определения времени старых файлов
sleep 60
echo "Deleting old backups and logs from $BACKUP & $LOG"
#удаление логов
find $LOG -type f \( -name "*.gz" -o -name "*.1*" \) -exec rm '{}' \;
#удаление старых файлов
find $BACKUP -type f -mtime +$OLD -exec rm '{}' \;
#отсылка уведомления на e-mail
mail -s "Cron backup" mymail@server.com <<< "`date` create new ahive $BACKUP/$DATE-files-$PREFIX.tar.bz2"
echo "end `date`"

 

После выполнения кода в папке /folder_backups/backup будут созданы 2 файла с именами, например, 2012-08-07-files-myprefix.tar.bz2 и 2012-08-07-sql-myprefix.tar.bz2. Все файлы с подобными именами в папке /folder_backups/backup старше 2 дней будут удалены.

 

Пояснения к коду.

do mysqldump -u $USER -p$PASSWORD \
        --add-locks \
        --ignore-table=$i.table1 \
        --ignore-table=$i.table2 \

--add-... - позволяет выполнить предварительное действие с базой данных перед созданием дампа. Конкретно --add-locks запирает базу данных на время создания дампа;
--ignore-table... - исключение таблицы из дампа. Конкретно --ignore-table=$i.table1 исключает таблицу table1 базы данных $i.

tar -cpPjf $BACKUP/$DATE-files-$PREFIX.tar.bz2 \
    --exclude=$BACKUP* \
    --exclude=*/tmp* \
    --exclude=*/log* \
    /myfolder1 \
    /myfolder2 \
    /myfolder3/subfolder

--exclude... - исключает указанные пути к файлам из резервной копии;
/myfolder1, /myfolder2, /myfolder3/subfolder и т.д. - перечень путей к файлам, включаемых в резервную копию;
* - в указаниях можно использовать маску.