Backup Incremental - Script Shell

Colaboração: Júnior Alex Mulinari

Bom alguns de vocês já devem ter se deparado com alguma questão de script shell nas provas de concurso. Neste post trago um pequeno script de backup incremental... Ou seja mato dois coelhos numa porrada só. Alta disponibilidade tem sido um tema recorrente nos diversos editais de TI.
"...Uma dica de Shell Script para quem já teve problemas com espaço para armazenar backups. Trabalho junto a equipe de manutenção do CodigoLivre (http://codigolivre.org.br), e os backups dos projetos são enormes. Não teríamos espaço suficiente para armazenar os backups diários por 7 dias. A saída foi fazer de forma incremental. O script abaixo faz backups incrementais usando recursos do GNU/Tar.


Basicamente o script cria um arquivo no formato:

< identifica >-< número >-< dia >-< mês >-< ano >-< dia >.tar.gz
e outro com o mesmo nome mais e prefixo .log, onde consta todos os arquivos e diretórios daquele backup.

< identifica >= é a identificação, caso você queira ter mais de um. No exemplo abaixo está como "Backup".
< número >= é a seqüência do incremento, como abaixo estamos dizer para fazer 7 dias, ele irá de 1 a 7.
< dia >= dia da realização do backup.
< mês >= mês da realização do backup.
< ano >= ano da realização do backup.
< dia >= dia da semana da realização do backup, exemplo Sun (Domingo), Mon (Segunda), Tue (terça), ....
.tar.gz = é o formato de compactação e concatenação.

Você deve criar um arquivo ($PREFIX/etc/list.conf) com a lista de diretórios a serem backupeados. Na lista deve conter o caminho completo do diretório, exemplo: /usr/local/apache.

Também é possível criar um arquivo ($PREFIX/etc/exclude.list) com exceções de backup, como por exemplo, arquivos de videos, musicas, etc.. exemplo:

*.mp3
*.avi

O formato do arquivo deve ser respeitado, colocando uma exclusão por linha.

Outras variáveis estão comentadas no script.

Inicio do script
#!/bin/bash
#
# Identificação dos arquivos
IDENTIFICA=Backup

# Numero de dias do ciclo de backup
DIAS=7

# E-mail do administrador
ADMIN=junior@solis.coop.br

# A partir de onde ficarão os arquivos
PREFIX=/backup

# Onde os arquivos de backup e logs ficarão armazenados
DIR_DESTINO=/backup/arquivos

# Lista de arquivos a não serem backupeados
EXCLUDE=$PREFIX/etc/exclude.list

# Arquivos temporário do script
TEMP=/tmp/.backup.$$

# Arquivos de controle do GNU/Tar
INC=$PREFIX/etc/incremental.conf

# Formato da data
DATA=$(date +%d-%m-%Y-%a)

# Arquivo com a lista de diretórios a serem backupeados
LISTA=$(cat $PREFIX/etc/list.conf grep ^\/ sort uniq)

# Arquivos gerado pelo script para controle de incremento
CONFIG=$PREFIX/etc/backup.conf

VOLTA=0
if [ ! -e $CONFIG ] ; then
touch $CONFIG
NUMERO=1
else
cp -f $CONFIG $CONFIG.bak
LINHAS=$(cat $CONFIG grep ^[0-9] wc -l)
[ $LINHAS -eq $((DIAS+1)) ] && VOLTA=1
FIRST=$(cat $CONFIG grep ^[0-9]- head -1)
LAST=$(cat $CONFIG grep ^[0-9]- tail -1)
OLD=$(echo $LAST cut -f1 -d"-")
OLD=${OLD:-0}
BACKUP_OLD=$(echo $FIRST cut -f1 -d"-")
FILE_OLD=$(echo $FIRST cut -f- -d"-")
if [ $OLD -eq $DIAS ] ; then
NUMERO=1
mv -f $INC $INC.bak
else
NUMERO=$((OLD+1))
fi
fi

DESTINO=$DIR_DESTINO/$IDENTIFICA-$NUMERO-$DATA

SEND_MAIL () {
sendmail $ADMIN <<> $DESTINO.log
tar --totals --ignore-failed-read --exclude-from=$EXCLUDE -zcvg $INC -f $DESTINO.tar.gz $LISTA >> $DESTINO.log 2>&1
df -h >> $DESTINO.log
SEND_MAIL $DESTINO.log
echo $NUMERO-$DATA >> $CONFIG
if [ $VOLTA -eq 1 ] ; then
rm -f $DIR_DESTINO/$IDENTIFICA-$FILE_OLD.tar.gz
rm -f $DIR_DESTINO/$IDENTIFICA-$FILE_OLD.log
sed 1d $CONFIG > $TEMP
mv -f $TEMP $CONFIG
fi


Estamos usando o script há mais de um ano, e não tivemos problemas com a execução, o que está faltando é um script que automatize a extração do backup.

Comentários

Postagens mais visitadas deste blog

Redação Ti Nota 10 - Klauss

Prova Discursiva nota 10 - Banca Cespe

Portugues - Orações