De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
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. O script abaixo faz backups incrementais usando recursos do GNU/Tar.
Basicamente o script cria um arquivo no formato:
-----.tar.gz
e outro com o mesmo nome mais e prefixo .log
, onde constam 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