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
[email protected]

# 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
Error: No site found with the domain '705839.zoqxoq1s.asia' (Learn more)