У администраторов 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 и т.д. - перечень путей к файлам, включаемых в резервную копию;
* - в указаниях можно использовать маску.
Сгинули все инопланетяне... Надоели мы им...
Круто!!!