Acesso direto ao conteúdo

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

você está aqui: Home  → Colunistas  →  Cantinho do Shell

 

 

Script Shell de Backup Incremental

Por Júnior Mulinari

Data de Publicação: 30 de Janeiro 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.

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=admin@exemplo.com.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.

Publicado originalmente na Dicas-L em 23 de Julho de 2005

Veja a relação completa dos artigos da coluna Cantinho do Shell

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir
  • Currently 3.16/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.2 /5 (282 votos)


Para se manter atualizado sobre as novidades desta coluna, consulte sempre o newsfeed RSS

Cantinho do Shell NewsFeed RSS

Para saber mais sobre RSS, leia o artigo O Padrão RSS - A luz no fim do túnel.

Opinião dos Leitores

Tiarê Balbi Bonamini
10 Fev 2011, 14:05
O Erro é na sintaxe do SEND_MAIL() {} no meu caso eu tirei essa notificação pois como o backup vai ficar agendando não tenho necessadade delas mas você pode verificar informações de uso sobre o SEND_MAIL()
sgtheliolima
05 Fev 2007, 09:12
script de backup incremental
Júnior Mulinari
01 Fev 2007, 14:19
Olá Cássio,

É provável que o conteudo da linha "FIMEMAIL" possua algum espaço em branco no inicio. É necessário que contenha apenas o texto, sem tabulação, exigido por ser definido como label.

Aproveitando para responder ao Arnaldo. Concordo com você, existem ferramentas muito interessantes e fáceis de serem gerenciadas para backup, outro exemplo é o Amanda.
Esse script foi desenvolvido em julho de 2005, quando o Amanda (gosto muito deste software ;-) ) ainda não conseguia emular fitas em disco. De qualquer forma, o comentário é válido!

Abraços,

Júnior
Cassio Rosas
31 Jan 2007, 14:03
Ola, parabens pelo script. Estou com um problema, como nao conheco nada de script quando rodo ele me traz a seguinte mensagem de erro:

./backup: line 81: syntax error: unexpected end of file



O que pode ser isso!?

abraços e obrigado,

*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script

Bombando o Shell - Caixa de Ferramentas Gráficas do Shell Linux></A>
</div>
<div align=center>
<!--
<a href='http://www.idph.net/inglesonline/inscricao.shtml' target='_blank'><img src='http://www.dicas-l.com.br/imagens/InglesOnline.jpg' border='0' alt=''></a><BR><BR>-->
<A HREF=http://iol.idph.com.br rel=

 

 

Procure pela casa ou apartamento ideal à venda ou para aluguel na busca inteligente do Imohoo
Buscar imóveis