Há alguns anos fiz um
sistema de backup em Shell Script, hoje configurei ele num servidor novo e reparei como ele tem sido útil e tem resultado muito bom, 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 reiniciá-los no fim, por exemplo para o MySQL antes de começar o backup e no fim voltar a inicializá-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 testá-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...
Esta também disponível no meu blog em:
Nenhum comentário foi encontrado.