Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile

Busca

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

Você está aqui: Home  → Arquivo Dicas-L

 

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

Script Shell de Backup Incremental

Colaboração: Júnior Alex Mulinari

Data de Publicação: 23 de Julho de 2005

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=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.

Espero que seja útil para a comunidade,

Abraços,

Júnior

Veja a relação completa dos artigos de Júnior Alex Mulinari

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 3.00/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (1935 votos)

Opinião dos Leitores

Cleber Ferreira
26 Fev 2012, 16:54
Parabens pelo tutorial. Estava precisando muito de um tutorial tipo o seu, bem explicado e tal.
Quando coloco pra rodar o script ele da um erro na ultima linha onde contem o "fi", syntax error: unexpected end of file
Sabe dizer o que e? Preciso muito rodar esse script e nao sei corrigir isso.

Abraço
Edson C da Silva
23 Out 2010, 18:24
Boa tarde.

Achei esta rotina bastante interessante e estou tentando implementa-la em um dos meus ambientes.

Porém notei que o script em sua execução está reportando o seguinte erro: "cut: não é valido um intervalo sem especificar limite: -
Experimente "cut --help" para mais informações."

Já olhei o help e não me parece que exista nenhum erro na sintaxe do script.

outro problema que tenho enfrentado é que não estou conseguindo efetuar backups de diretórios individuais - criei uma lista de diretórios com um alvo por linha, mas ao executar a rotina ao invés de um arquivo para cada linha da lista - é criado um arquivo apenas para o diretório pai.

Continuo testando para tentar entender o que ocorre.

Até mais!
*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

Treinamentos, Consultorias e Soluçoes em TI. Baseados em softwares livres e padrões abertos para ambientes de missão crítica

Submarino.com.br

Objective-C Fundamental