Início Backup diferencial e incremental com TAR
André Stato 15 de fevereiro de 2016 5 comentários Linux
Neste Post falarei um pouco sobre backup.
Existem vários tipos de backup entre eles temos o Total ou Normal, Incremental e Diferencial.
O backup Total como o nome diz , faz um backup completo de todos os dados no estado em que se encontram, e normalmente é o primeiro backup a ser feito para depois se usar um dos outros tipos.
Uma coisa que deve ser analisada é quanto tempo levará para fazer o backup, ou melhor, ainda, qual a janela que temos para fazer o backup. Imagine que temos um backup muito grande e este demora em torno de 6 horas, mas temos um espaço disponível das 24:00 até as 04:00. Obviamente não é suficiente para fazê-lo. Desta forma é necessário fazer backup de outra forma e é neste momento que pensamos em outros tipos de backup.
O backup incremental é mais rápido em relação ao diferencial, pois o mesmo copiará somente o que foi alterado desde o último backup completo ou diferencial. Mas em contrapartida a restauração dele é mais complexa e demanda de maior tempo, já que será necessário restaurar todos os backups incrementais feitos e se um dos backups sofrer algum problema, os dados daquele dia não poderão ser recuperados.
Já o backup diferencial, copia todos os dados alterados desde o último backup completo. Ele com certeza leva mais tempo que o backup incremental, mas em relação a restauração é bem mais simples, pois basta restaurar o ultimo backup diferencial, lógico que tanto o diferencial como o incremental vão precisar do primeiro backup completo.
Existem muitas soluções ótimas como o Bacula para automatizar, gerenciar backups. Ainda temos o Amanda, Backup-PC e outros ainda não free como EMC, Backup EXE, etc.
Mas um simples script pode resolver nossos problemas usando a tão conhecida ferramenta tar. O tar por padrão já possui suporte à backups incrementais através do uso de uma opção –g ou –listed-incremental apontando para um arquivo onde ficarão armazenados a lista dos arquivos copiados. Sua sintaxe abaixo é bem simples:
#tar cf nomedobackup.tar –g /caminho/do/arquivo/controle.txt /dir1 /dir2
No comando acima não forma utilizadas formas de compactação como gzip (-z) ou bzip2 (-j ), mas é possível ainda o uso destes. O primeiro backup à ser feito será o backup completo, que no primeiro momento criará a lista dos arquivos copiados. Nos próximos backups, essa lista já será usada normalmente para trazer somente arquivos alteras. Ou seja, o comando sempre será o mesmo, alterando-se somente o nome do arquivo de backup, algo como backup.full.tar, backup.inc1.tar, backup.inc2.tar, etc. Isso fica mais a gosto de freguês.
Desta forma é fácil criar um script que poderá fazer um backup completo na segunda por exemplo e incrementais até sexta-feira.
Algumas opções do tar podem ser muito interessantes, como –T para informar o caminho de um arquivo que conterá todos os diretórios e arquivos que devem copiados para o backup, outra opção interessante –-exclude para excluir arquivos e diretórios desse backup, por exemplo , fazer backup da pasta /etc/ e excluir a pasta /etc/backup.
Abaixo um script para gerenciar backups incrementais que fiz baseando no dia da semana de 1 a 5, onde 1 é segunda feira e é feito um backup completo e o outros dias são todos incrementas , e novamente começa tudo na segunda deixando os backups da semana anterior salvo.
#Arquivo de controle do TAR
CONTROLE="/etc/backup/incremental.txt"
#PASTAS QUE DEVEM SER FEITO BACKUP
PASTAS="/etc/backup/pastasbackup.txt"
#LOCAL ONDE SERÁ SALVO BACKUP
LOCALBACKUP="/etc/backup"
#DIA DA SEMANA DE 0 A 7, ONDE 0 E 7 SÃO DOMINGO, 1 SEGUNDA, ETC.
echo 1 >/etc/dia.txt
rm -rf $CONTROLE
mv $LOCALBACKUP/backupfull.tar $LOCALBACKUP/backupfull.tar.old
tar -cf $LOCALBACKUP/backupfull.tar -T $PASTAS -g $CONTROLE –exclude /etc/backup/*
mv $LOCALBACKUP/backup.inc$DIA.tar \
$LOCALBACKUP/backup.inc$DIA.tar.old
tar -cf $LOCALBACKUP/backup.inc$DIA.tar -T $PASTAS -g $CONTROLE –exclude /etc/backup/*
if [ $DIA == 1 ];then
Esse script pode deverá se colocado no crontab , conforme a necessidade de execução, por exemplo de segunda a sexta , teríamos uma entrada similar a está abaixo, para executar as 23:00:
00 23 * * 1-5 root /bin/scriptbackup.sh
Os arquivos citados no script, como diretório de arquivo, lista de diretórios, devem ser criados com antecedência.
Mas quando falamos de backup diferencial o tar não tem suporte direto a isso, desta forma é necessário usar o find para procurar arquivos mas antigos. Para esse problema eu sempre uso o comando touch para alterar a data de um arquivo e o find para procurar esses arquivos, enviado a saída para um arquivo de texto, que será usado pelo tar para fazer o backup.
No final acaba sendo mais fácil ainda que o incremental.
O comando touch pode ser usado da seguinte forma para alterar a data hora de um arquivo, para usa-lo como base para pesquisa.
touch -t YYYYMMDDHHMM arquivocontrole
Onde temos ano, mês , dia, hora e minuto para os novos valores do arquivo. Agora basta falar ao find para procurar arquivo que tenham sido modificados deste a data deste arquivo até a data atual. Podemos fazer esse processo de alteração toda segunda feira para configurar como data atual , depois do backup completo, e a partir dai usa-lo como referência. O mais complexo neste outro script é o tar pegar somente os arquivos alterados da lista, pois o find se usado normalmente com a opção –cnewer ( somente os mais recentes que o arquivo de base), traz de qualquer forma os diretórios também. Desta forma o find deverá procurar da seguinte forma:
find /pastas \( -cnewer arquivodebase –a ! –type d \)
Aqui diz para procurar arquivos mais novos que arquivodebase e que não sejam diretórios ( ! –type d).
Já dessa forma filtraremos somente o que é mais novo em relação ao arquivo de base e não trará diretórios.
Finalmente podemos montar esse script abaixo:
#DIA DA SEMANA 0 -7
#DIRETORIOS E ARQUIVOS QUE DEVEM SER FEITO BACKUP
#LOCAL ONDE SERÁ SALVO O BACKUP
#ARQUIVO DE BASE PARA O FIND
CONTROLEFIND="/etc/backup/diferencial"
tar -cf $LOCALBACKUP/backupfull.tar -T $PASTAS –exclude=/etc/backup/*
touch -t `date +%Y%m%d%H%M` $CONTROLEFIND
diferencial()
mv $LOCALBACKUP/backup.dif$DIA.tar $LOCALBACKUP/backup.dif$DIA.tar.old
find `cat $PASTAS` \( -cnewer $CONTROLEFIND -a ! -type d \) >/etc/backup/listadiferencial.txt
tar -cf $LOCALBACKUP/backup.dif$DIA.tar -T /etc/backup/listadiferencial.txt –exclude=/etc/backup/*
Neste script acima, temos também duas funções completo e diferencial. No completo ele simplesmente pega o arquivo com a lista dos diretórios que devem ser copiados, exclui do backup a pasta /etc/backup usada como local de backup e executa o backup normalmente.
Já o diferencial é bem mais complexo. Primeiro é deletado o backup da semana anterior ( assim como no completo ), o find procura arquivo que sejam mais novos que o arquivo base ( conforme visto anteriormente) e passa para o tar uma lista com os arquivos a serem copiados.
O if, verifica somente se é segunda ou não, pois segunda roda o backup full.
Não esqueça de também adicionar no crontab.
Bom pessoal, um ferramenta simples, mas usando shell script torna-se totalmente funcional. É possível implementar vários outros itens, como testar o arquivo de backup para ver se está funcionado, entre outros.
Lembre-se backup bom, é backup que pode ser restaurado. Então sempre que possível teste o restore, ou crie um script para fazer isso para você e avisar se está com problemas.
Espere que aproveitem.
Artigo anterior Trabalhando com Array no Shell
Próximo artigo Configurando o GRUB 2
Estou tentando fazer um backup incremental, e estou utilizando o comando:
tar –ignore-failed-read –ignore-zeros -cjf 20171008.tar.gz -g incremental.txt /diretoriox/
O primeiro backup, que seria o full, rodou perfeito, porém, os outros ele está gerando com várias pastas em branco, com os subdiretórios. Por exemplo 13120254760, 13134636754, 13134641224, 13140750707, esses são alguns exemplos de pastas que ele gerou. E dentro dessas pastas existe um caminho completo para as pastas que estão dentro do diretório que estou fazendo o backup (neste exemplo o diretoriox), mas todas elas vazias, pois não houve nenhuma modificação dentro delas.
Você saberia me dizer o que posso fazer para essas pastas em branco não apareçam no backup?
Eloi, tudo bem..
Bem , o tar quando faz backup incremental, justamente copia toda estrutura de pastas e se houver alteração qualquer , ai ele copia os arquivos alterados. Ele faz desta forma, justamente para ter o controle do que foi alterado.
Enfim, não sei ao certo se existe uma forma, mas sei que ele usa esse controle.
Muito obrigado pelo auxílio, seu script ajudou um bocado.
Trabalho com um servidor Linux Ubuntu, somente terminal. Ele possui um RAID 5 gerenciado por uma controladora com 8HD's, sendo 7 no array e 1 como hotspare, totalizando 18TB de dados. A controladora está com defeito e por este motivo o linux não monta os HD's (/dev/sdc), impedindo que eu visualize os arquivos. Se eu usar o Live CD, também não consigo ver o conteúdo dos hd's.
Preciso fazer um backup desses 18TB, tenho disponíveis 10 hd's de 3TB. Qual seria o melhor comando para transferir estes dados?
Bom, nesse caso como o RAId já está com problema, tanto o Linux , como qualquer outro sistema, não conseguirá acessar e montar normalmente.