Скрипт бекапа виртуальных хостов

Ну что ж - напишу и я свой скрипт бекапов для виртуальных хостов по старой доброй традиции =)
Потому как каждый администратор должен написать такой скрипт.

Я использую инкрементальный бекап для файлов, создаваемый с применением утилиты rdiff-backup и бекап всех БД на сервере.

Для начала установим rdiff-backup. Нам потребуется подключить epel репозиторий. Как это сделать я описывал тут. Подключили? Выполняем:
yum install rdiff-backup

Теперь сам скрипт. Сразу объясню. Скрипт будет лежать в /root/scripts/backup_mysql_rdiff.sh, хотя, конечно, это как Вам самим удобно. Он запускается на сервере, на котором выполняется бекап. И складывает всё на удалённый сервер (backup-server). Предполагается, что есть несколько серверов, которые все отправляют данные на бекап-сервер, поэтому на последнем под каждый сделана своя папка, чтобы проще было искать данные. Поехали:

Spoiler: Highlight to view

#!/bin/bash
 
www="/var/www"
serverIP="xx.xx.xx.xx"
backupWwwDir="/backup/$serverIP/www"
backupMysqlDir="/backup/$serverIP/dumps"
backupSrvIP="xx.xx.xx.xx"
mysqlRootPaswd="your_mysql_root_password"
mysqldumpOptions="--single-transaction --quick --skip-extended-insert"
dd=`date +'%Y_%m_%d_%H'`
 
## hostname for backup in /var/www folder
hostName="
mysite.ru
alexxkn.ru
example.org
"
## Title of the message with relust
echo "$serverIP /root/scripts/backup_mysql_rdiff.sh"
echo
 
## Backups file system
for host in $hostName;
do
  nice -n 20 rdiff-backup $www/$host $backupSrvIP::$backupWwwDir/$host;
  echo -n $host && echo -e "\t\t`ssh $backupSrvIP rdiff-backup -l $backupWwwDir/$host/ | tail -1`";
done
 
## Backups all mysql 
for db in `mysql -p$mysqlRootPaswd -Ns -e "show databases;" | grep -v performance_schema | grep -v information_schema | grep -v mysql`;
do
  mysqldump -p$mysqlRootPaswd $mysqldumpOptions $db | gzip | ssh $backupSrvIP dd of="$backupMysqlDir/$db-$dd.sql.gz" > /dev/null 2>&1
done
 
## The output list of databases
echo "Databases"
ssh $backupSrvIP ls -la $backupMysqlDir | grep `date +'%Y_%m'`
echo



Ну вот, теперь ставим это дело в крон. Время начала выполнения скрипта выбираем какое нужно, прописываем ip сервера (или доменное имя), который выполняет бекап, почту указываем свою:
00 01 * * * root /root/scripts/backup_mysql_rdiff.sh 2>&1 | mail -s "Backup xx.xx.xx.xx report" admin@mysite.ru
Получаем письмо с отчётом вида:
Spoiler: Highlight to view
xx.xx.xx.xx /root/scripts/backup_mysql_rdiff.sh

mysite.ru Current mirror: Mon Oct 14 14:06:59 2013
alexxkn.ru Current mirror: Mon Oct 14 14:07:15 2013
example.com Current mirror: Mon Oct 14 14:07:35 2013

Databases
-rw-r--r-- 1 root root 85957 Окт 1 01:20 mysiteru-2013_10_01_01.sql.gz
-rw-r--r-- 1 root root 85957 Окт 2 01:20 alexxknru-2013_10_02_01.sql.gz
-rw-r--r-- 1 root root 85957 Окт 3 01:20 example.com-2013_10_03_01.sql.gz
...



Вот и всё. Всё структурировано, удобно и просто. Скрипт ротации бекапов описан мной тут. Что касается ротации файлов, у rdiff-backup есть команда, которая позволяет удалять инкременты старше определённого "возраста" (man rdiff-backup).
Spoiler: Highlight to view

--remove-older-than time_spec
              Remove  the  incremental  backup  information  in  the  destination  directory  that has been around longer than the given time.  time_spec can be either an absolute time, like "2002-01-04", or a time interval.  The time interval is an integer followed by the character s, m, h, D, W, M, or Y, indicating seconds, minutes, hours, days, weeks, months, or years  respectively,  or  a  number of these concatenated.  For example, 32m means 32 minutes, and 3W2D10h7s means 3 weeks, 2 days, 10 hours, and 7 seconds.  In this context, a month means 30 days, a year is 365 days, and a day is always 86400 seconds.


Если есть такая необходимость используйте её в скрипте.
rdiff-backup  --remove-older-than time_spec

Удачи!

Добавить комментарий

CAPTCHA
Этот вопрос задается для того, чтобы выяснить, являетесь ли Вы человеком или представляете из себя автоматическую спам-рассылку.
Target Image