você está aqui: Home → Colunistas → Cantinho do Shell
Colaboração: Júnior Alex Mulinari
Data de Publicação: 16 de Novembro de 2007
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 de incremento>-<dia>-<mês>-<ano>-<dia da semana>.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 de incremento> = é 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 da semana> = 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.
#!/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 << FIMEMAIL Subject: Backup CL $(date +%d-%m-%Y) Backup realizado no arquivo: $DESTINO.tar.gz FIMEMAIL } df -h > $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.
Esta dica foi publicada originalmente na Dicas-L em 23 de julho de 2005