Friday, May 9, 2008

Backup

A alguns anos fiz um sistema de backups em ShellScript e hoje configurei ele num servidor novo, e reparei como ele tem sido útil e tem resultado muito bem, resolvi partilhar.

Criar as pastas:

# mkdir /backup
# mkdir /backup/log


Criar os seguintes arquivos:

# touch /backup/backup
# touch /backup/backup.start
# touch /backup/backup.end
# touch /backup/directory
# touch /backup/run


Dar permissões de execução:

# chmod +x /backup/backup
# chmod +x /backup/backup.start
# chmod +x /backup/backup.end
# chmod +x /backup/run


Os backups diários serão guardados dentro da pasta /backup/daily. E os mensais sempre no dia 1 serão guardados dentro da pasta /backup/monthly. Não é preciso criar estas pastas, elas são criadas automaticamente.

Colar este conteúdo no arquivo /backup/backup:

#!/bin/bash
echo ""
echo -e "\e[40;32;1m Backup \e[0m"
echo ""
echo -e "\e[44;33;1m Start \e[0m"
echo ""
dir1="/backup"
dir2=$1
echo -ne "\e[34;1mcomand.begin\e[0m \e[32mstart\e[0m \e[30;5m...\e[0m"
$dir1/backup.start
echo -e "\e[31;1m end \e[0m"
echo ""
dateDay=`date "+%d"`
dateMonth=`date "+%m"`
dateYear=`date "+%Y"`
folder1=$dir1/daily/$dateDay
folder2=$dir2/daily/$dateDay
echo -ne "\e[34;1mWork Folder\e[0m $folder1 \e[32mstart\e[0m \e[30;5m...\e[0m"
rm -dfr $folder1
mkdir -p $folder1
echo -e "\e[31;1m end \e[0m"
echo ""
if [[ $dir2 != "" ]]; then
echo -ne "\e[34;1mWork Folder\e[0m $folder2 \e[32mstart\e[0m \e[30;5m...\e[0m"
rm -dfr $folder2
mkdir -p $folder2
echo -e "\e[31;1m end \e[0m"
echo ""
fi
echo -e "\e[40;31;1m BACKUP: directory \e[0m"
echo " |"
_x=0
_to=""
for i in `cat /backup/directory`; do
if [ $_x = 0 ]; then
_to=$folder1/$i.tar.gz
echo -ne " | $i \e[32mstart\e[0m \e[30;5m...\e[0m"
_x=1
else
tar -czPf $_to $i
if [[ $dir2 != "" ]]; then
cp -rf $_to $folder2
fi
echo -e "\e[31;1m end \e[0m"
_x=0
fi
done
echo " |____________________________________________________"
echo ""
echo -ne "\e[34;1mcomand.end\e[0m \e[32mstart\e[0m \e[30;5m...\e[0m"
$dir1/backup.end $folder1
echo -e "\e[31;1m end \e[0m"
if [ $dateDay = 01 ]; then
folderMonthly1=$dir1/monthly/$dateYear.$dateMonth.$dateDay
echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly1 \e[32mstart\e[0m \e[30;5m...\e[0m"
mkdir -p $folderMonthly1
cp -rf $folder1 $folderMonthly1
echo -e "\e[31;1m end \e[0m"
if [[ $dir2 != "" ]]; then
folderMonthly2=$dir2/monthly/$dateYear.$dateMonth.$dateDay
echo -ne "\e[34;1mMonthly Backup]\e[0m $folderMonthly2 \e[32mstart\e[0m \e[30;5m...\e[0m"
mkdir -p $folderMonthly2
cp -rf $folder2 $folderMonthly2
fi
echo ""
fi
echo ""
echo -e "\e[44;33;1m End \e[0m"
echo ""
echo -e "\e[40;32;1m by eduveks \e[0m"
echo ""


O arquivo /backup/run é o que inicia o backup e grava o output no arquivo de log, colocar o seguinte conteúdo:


#!/bin/bash
logFileName=`date "+%Y-%m-%d_%H-%M-%S"`
/backup/backup "/mnt/backupmirror" > /backup/log/$logFileName


Atenção ao "/mnt/backupmirror/backup", esta opção é para fazer uma cópia do backup para outra pasta, no meu caso sempre uso um servidor secundário para ter um espelho do backup original, e esta pasta é uma pasta montada remotamente ao outro servidor.

Os arquivos /backup/backup.start e /backup/backup.end, servem para poder colocar comandos para serem executados antes e depois do backup respectivamente, por exemplo para fazer o mount e o umount de uma partilha remota, preparando o cenário da cópia secundária. Ou ainda para parar serviços e reinicia-los no fim, por exemplo para o MySql antes de começar o backup e no fim voltar a inicializa-lo. Gravar nestes arquivos o conteúdo:


#!/bin/bash


Finalmente o arquivo /backup/directory serve para dizer as pastas que deverá ser feito backup, adicionar aqui o nome que vai ter o arquivo.tar.gz e qual a pasta que vai ser armazenada neste arquivo, no seguinte formato:


DB_NAME     /var/lib/mysql/DB_NAME
USER1       /home/USER1


Depois de tudo afinado vamos executar o backup, assim podemos ver o output:

# /backup/backup


Se tudo correu bem, o backup deverá estar em:

# /backup/daily/01/DB_NAME.tar.gz
# /backup/daily/01/USER1.tar.gz


Onde o "01" é o número do dia do mês atual.

Assim a cada dia haverá uma pasta com os backups deste dia, e no dia 1 de cada mês, o backup deste dia estará em:

# /backup/monthly/2008.05.01/01/DB_NAME.tar.gz
# /backup/monthly/2008.05.01/01/USER1.tar.gz


E executar o backup passando uma pasta para ser o espelho do backup:

# /backup/backup /tmp


Poderá reparar que também dentro do /tmp passará a ter o conteúdo do backup.

Feito o teste, voltar a ver como esta o /backup/run, verificar se esta tudo certo, e testa-lo:

# /backup/run


Dentro da pasta /backup/log deverá ter o log do backup:

# cd /backup/log
# ls
# cat 2008-05-01_11-51-53


Agora só falta configurar no crond para executar o backup, criar um arquivo no /etc/cron.daily/backup, com o seguinte conteúdo:


#!/bin/sh
/backup/run


Pronto, agora o backup irá ser executado todos os dias, e assim temos uma solução bem simples e prática para fazer backups...

No comments:

Post a Comment