Desenvolvi 4 scripts para implantar um sistema de backup, uso eles em clientes e estão totalmente funcionais. Temos os scripts full.backup, diferencial.backup, compactar.backup que devem ser agendados pela crontab ou anacron, e restore.backup que deve ser rodado manualmente. HAPPY LINUX HAPPY BACKUP.
Mostrarei o código fonte dos scripts que eu criei, através dos comentários no código poderá ser compreendido seu funcionamento, qualquer duvida é só postar!
Descrição:
Script full.backup: o objetivo desse script é criar um backup de todo o conteúdo pré-determinado, ele também exclui backups full feitos a mais de 15 dias na mídia de destino;
Script diferencial.backup: esse cria o backup dos arquivos que foram modificados a n dias atrás, sendo que n pode ser alterado no código fonte. Ele também exclui backups diferencias feitos a mais de duas semanas. Ao terminar de rodar esse script ele chama automaticamente o compactar.backup, que faz o tar.gz do backup diferencial;
Script compactar.backup: é feito um gz do arquivo dos arquivos de backup caso não tenha sido feito.
Recomendo que esse 3 scripts sejam agendados através da cron na crontab.
Há mais um script, o restore.backup, esse deve ser rodado manualmente, pois o objetivo dele é visualizar os logs de backups já realizados e restaurar backups caso seja necessário. Foi criado para um usuário do sistema poder recuperar o backup sem recorrer a comandos.
LEMBRE-SE: Os scripts são exemplo, o valor das constantes e variáveis pode ser mudada por você dependendo do ambiente onde ele será colocado em produção.
[3] Comentário enviado por JhoniVieceli em 22/02/2008 - 11:53h
-----------ATENÇÃO!!!!! BUG NO SCRIPT DE BACKUP DIFERENCIAL----------
Coloquei uma variável que não existe no código do Backup Diferencial, a váriavel é a $TMP_FIND, isso pode estar causando erros como esse
"find: argumento inválido `-exec' para `-cmin'"
o código com erro é esse:
find $SRCDIR -type f -cmin $TMP_FIND -exec tar -rvf $ARQ {} ";"
Para CORRIGIR!
cole esse código a seguir com a variável correta! ($TIME_FIND) no lugar do código find anterior
find $SRCDIR -type f -cmin $TIME_FIND -exec tar -rvf $ARQ {} ";"
Peço desculpa a todos por esse erro, acabei mandando um script de versão anterior a final pro VOL que continha esse BUG sem querer.
Slackjackson quanto ao seu problema verifique lá no inicio do código se a variável $SRCDIR esta preenchida corretamente (com espaços entre os diretórios e com aspas duplas fechando). Se ainda estiver dando erro tente colocar o nome do diretório diretamente no local sem usar variavel isso pode resolver o problema.
Exemplo:
find /home/usuario -type f -cmin $TIME_FIND -exec tar -rvf $ARQ {} ";"
Obrigado e desculpa pelo pequeno erro e qualquer coisa posta de novo que vou ajudando na medida que eu puder
[7] Comentário enviado por agimenez em 22/02/2008 - 19:12h
muito legal cara, eu criei um esses dias, mas vou estudar o seu pra ver o q posso melhorar, uma coisa q fiz q eh bem legal, seria vc logar o bkp e enviar por email usando o mutt.
Por ex.: Crie um script que chame seu backup assim:
[12] Comentário enviado por agimenez em 27/02/2008 - 08:35h
Cara, tenho impressão que o comando:
#apagando arquivos mais antigos (a 7 dias que existe (-cmin +2)
find $DSTDIR -name "dif*" -ctime $TIME_DEL -exec rm -f {} ";"
if [ $? -eq 0 ] ; then
echo "Arquivo de backup mais antigo eliminado com sucesso!"
else
echo "Erro durante a busca e destruição do backup antigo!"
fi
ele não está apagando no meu, mas o comando está certinho....
Alguma diga para debugar?
[13] Comentário enviado por JhoniVieceli em 27/02/2008 - 09:13h
kra tenta fazer o seguinte:
Obs: supondo que onde esteja os backups esteja em /mnt/hdb
1 - escreva em um shell ai a parte o comando
find /mnt/hdb -name "dif*" -ctime +7 -exec rm -f {} ";"
ou
2 - no script escreva
echo "find $DSTDIR -name "dif*" -ctime $TIME_DEL -exec rm -f {} ";""
e verifique o que ele imprime
Confira pra ver se o codigo esta ok!
Se o código estiver ok e ele não estiver executando deve ser por que os arquivos que vc esta criando estão com a data muito recente ( menos de 7 dias de existencia), para testar isso use o comando touch para cria-los com data antiga, mais detalhes nesse link http://www.vivaolinux.com.br/dicas/verDica.php?codigo=7772
Ou altera a data do ctime de +7 para +1 ou -1 para fazer o inverso
[14] Comentário enviado por agimenez em 27/02/2008 - 22:52h
Valeu cara, consegui resolver, o meu problema era o "dif*"... é o mal do ctrl+c / ctrl+v ... eu acrescentei esse trecho do seu código e não adaptei ao meu... mais uma vez.. Parabéns! Abraço!
[16] Comentário enviado por f9informatica em 03/03/2008 - 19:32h
Meu caro veiodruida, antes de qualquer coisa gostaria de parabeniza-lo pela dica e pela dedicao ao linux e interesse em ajudar a comunidade.
Me ajude por favor meu amigo. É o seguinte uso o SUSE 9.3 e estou precisando implementar uma rotina de backup e quando vi sua solucao meu olhos brilharam rsrsr é que nao tenho muita experiencia com scripts e pensei em implementar suas rotinas aqui.
Consegui com sucesso implementar a rotina de backp full inclusive pegando backups de particoes NTFS. Tudo fino e funcionando inclusive com agendamento no cron.
Mas quando tento implementar a sua rotina de backup diferencial da um erro sobre esse comando find tentei aplicar a dica que vc deu ao agimenez mais nao deu certo.
[17] Comentário enviado por JhoniVieceli em 04/03/2008 - 11:48h
Opa!
Primeiro obrigado por gostar do artigo fico feliz valeu mesmo!
Antes quero saber qual extamente é o erro que esta acontecendo, mas mesmo assim vou te mostar como depurar o find.
Tente aplicar um find simples assim:
find /mnt/hdb -name "dif*"
onde mnt/hdb é a partição e dif* é todos os arquivos iniciados com essa palavra, claro só vai retornar resultado se esses paramentros forem atendidos. pode mudar dif* pra qualquer outra palavra só de teste.
deu certo?
bem se deu tente depois
find <particao> -name "<nome do arquivo>" -ctime +14
e veja se ele lista arquivos mais antigos do que 14 dias sendo que vc pode substituir por outro valor no mais (ex: +30)
deu certo?
bem se deu tente
find <particao> -name "<nome do arquivo>" -ctime +14 -exec ls -la {} ";"
Agora através da lista (ls -la) ele vai mostrar as permissões dos arquivos, 1 por 1 se deu certo até aqui jóia!
agora substituia a expressão de teste que a gente criou pela original do programa e vá depurando por partes pra ver o que acontece
[18] Comentário enviado por esgol em 22/03/2008 - 11:39h
Caro veiodruida,
No Backup diferencial tá dando o erro:
find: argumento inválido `-exec' para `-cmin'
provavelmente o mesmo do f9info mas a sintaxe parece estar ok, o que pode ser?
Abraços.
[19] Comentário enviado por JhoniVieceli em 24/03/2008 - 13:50h
Opa!
Cara provavelmente o teu find não deve ter alguns dos comandos que eu coloquei aqui como parâmentro.
Faz o seguinte da um "$man find" no console e veja se aparece os comandos -exec e -cmin. Verifique também se as variáveis estão corretas se você preencheu elas corretamente com valores que vc quer.
Se sim tente o seguinte. No lugar das variáveis coloque valores absolutos.
EXEMPLO:
find $DSTDIR -name "dif*" -ctime $TIME_DEL -exec rm -f {} ";"
COLOQUE NO CONSOLE ASSIM
find <dir de destino> -name "dif*" -ctime <tempo existe backup> -exec rm -f {} ";"
TRADUZINDO:
find /var/backups -name "dif*" -ctime +14 -exec rm -f {} ";"
Isso claro se vc estiver fazendo backup no diretorio /var/backups
[20] Comentário enviado por slackjackson em 24/03/2008 - 16:48h
veiodruida, eu estava com o mesmo erro de "esgol", mas o meu era na seguinte linha: "find $SRCDIR -type f -cmin $TMP_FIND -exec tar -rvf $ARQ {} ";"" na hora de criar o arquivo de backup e não na hora de excluir, então eu vi q no script ñ existe a variável "TMP_FIND" e sim "TIME_FIND", fiz a substituição e parou de dá erro. ai apareceu outro problema, ele salva o arquivo de backup, mas dentro dele ñ tem nd, ele fica completamente vasio.
cara o script tah muito bom e me ajudando muito...me dá uma força ai.
[21] Comentário enviado por JhoniVieceli em 25/03/2008 - 11:42h
-----------ATENÇÃO!!!!! BUG NO SCRIPT DE BACKUP DIFERENCIAL----------
Coloquei uma variável que não existe no código do Backup Diferencial, a váriavel é a $TMP_FIND, isso pode estar causando erros como esse
"find: argumento inválido `-exec' para `-cmin'"
o código com erro é esse:
find $SRCDIR -type f -cmin $TMP_FIND -exec tar -rvf $ARQ {} ";"
Para CORRIGIR!
cole esse código a seguir com a variável correta! ($TIME_FIND) no lugar do código find anterior
find $SRCDIR -type f -cmin $TIME_FIND -exec tar -rvf $ARQ {} ";"
Peço desculpa a todos por esse erro, acabei mandando um script de versão anterior a final pro VOL que continha esse BUG sem querer.
Slackjackson quanto ao seu problema verifique lá no inicio do código se a variável $SRCDIR esta preenchida corretamente (com espaços entre os diretórios e com aspas duplas fechando). Se ainda estiver dando erro tente colocar o nome do diretório diretamente no local sem usar variavel isso pode resolver o problema.
Exemplo:
find /home/usuario -type f -cmin $TIME_FIND -exec tar -rvf $ARQ {} ";"
Obrigado e desculpa pelo pequeno erro e qualquer coisa posta de novo que vou ajudando na medida que eu puder
[22] Comentário enviado por ricardoas30 em 20/12/2008 - 17:53h
Olá colega, gostaria de parabeniza-lo com os scripts. Estou com um probleminha. quando ele gera o arquivo ele não está gerando correto. ele gera assim: full-17-12-2008- não coloca a extensão e me parece que não finaliza a geração do arquivo deixando corrompido.
Estou utilizando o script do backup_full.sh
Gostaria de saber se é algum tipo de BUG ou se for reporta-lo.
[24] Comentário enviado por lsilveira em 21/05/2009 - 12:04h
tar: /root/backup-full-05/21/09.tar.gz: Cannot open: No such file or directory
tar: Error is not recoverable: exiting now
tar: Removing leading `/' from member names
[25] Comentário enviado por pecelo em 26/05/2009 - 09:35h
para lucasSA
vc tem que mudar o comando date, ele esta no formato com "/", o bash esta procurando diretorios /21/09.tar.gz mas o diretorio /21 não existe, isso no seu caso!mude para "date +%d-%m-%y" e tdo funcionara bem
[26] Comentário enviado por malsi2 em 08/07/2009 - 21:57h
cara, muito boa ideia !!! codigo limpo e bem comentado... é isso ai !!!
ja fiz os 4 scripts funcionar aqui com algumas adaptações para o meu uso tipo nome dos arquivo, diretórios etc... esta funcionando perfeitamente. gostaria de sua opnião quanto ao agendamento desse backup, qual a frequencia que vc acha legal de usar cada um dos scripts, essas coisas ?
no mais, parabéns mesmo pelo código !
um abraço a todos do vol !
[27] Comentário enviado por jgama em 10/07/2009 - 00:13h
Mesmo trocando a forma de data no script backup_diferencial para
DATA=`date +%d-%m-%y`
Quando executo o script ainda aparece estas linhas abaixo:
root@firewall1:/usr/bin# sh /usr/bin/_backup_diferencial.sh
Programa de Backup Diferencial
Data de inicio: Thu 09 Jul 2009 11:35:23 PM BRT
tar: Removing leading `/' from member names
/etc/random-seed
tar: Removing leading `/' from member names
/etc/adjtime
tar: Removing leading `/' from member names
/etc/motd
tar: Removing leading `/' from member names
/etc/gtk-2.0/gtk.immodules
tar: Removing leading `/' from member names
/etc/mtab
tar: Removing leading `/' from member names
/etc/ld.so.cache
tar: Removing leading `/' from member names
/chroot/named/var/run/named.pid
tar: Removing leading `/' from member names
/chroot/named/named.run
--------------------------------------
Backup Diferencial concluído com sucesso
Data de termino: Thu 09 Jul 2009 11:35:23 PM BRT
Log gerado em /var/log/backup_diferencial.log
Arquivo de backup mais antigo eliminado com sucesso!
Script de compactação
Data de inicio: Thu 09 Jul 2009 11:35:23 PM BRT
Compactação concluída
Data de termino: Thu 09 Jul 2009 11:35:23 PM BRT
Compactação concluída
Log gerado em /var/log/backup_compactacao.log
O script executa com sucesso, mas como faço para deixar limpo sem esta informações:
tar: Removing leading `/' from member names
[28] Comentário enviado por JhoniVieceli em 10/07/2009 - 10:10h
TETEU Obrigado por ter gostado do código, sei que ele nao ta lá aquelas coisas mas ja da uma mão para quem não tem nenhum esquema de backup...
Quanto ao esquema do agendamento do backup, acho que isso é dificil de definir uma padrão, ja que isso pode mudar de cliente para cliente.
Em clientes com pouca massa de dados, eu recomendo:
Backup full seja feita uma vez por semana, na madrugada de sexta para sabado ou no sabado, ao terminar esse backup, ter uma planilha de controle e anotar a data e o nome de quem fez o backup. Em alguns casos em usei HD externo usb e embaixo do hd colei um papel com uma pequena planilha, para registros de backup. Porém nada impede de ser feito backup full todo dia como falei isso depende do nivel de dados e dos recursos que vc tem (hds, midia, storage etc...)
Gosto do backup diferencial durante a semana em lugar do incremental, pois com o incremental se for perdido um dos backups c ta ferrado.rsrsrsr mas como falei isso depende da sua politica de backup.
No backup diferencial, o agendamento dele é relativo a massa de dados movimentada na empresa, pode ser feito de hora em hora ou no fim do dia. Dependendo interessante adotar um backup as 12:00 e outro as 18:00 no fim do expediente. Esses backups podem ser gravadas em midias dvd-rw ou em hd externo mesmo, um para cada dia da semana.
O tempo que ficará quardado o backup depende também, eu geralmente deixo o full quardado por 1 mês e depois reaproveito a midia (hd externo ou outra qualquer).
Outro ponto importante é que o backup deve ficar em lugar seguro, se ficar na empresa quardar em cofre corta-fogo, de preferencia uma copia do backup deve ser levada para casa do responsavel pelos dados (dono, gerente etc...), em algumas empresas todo dia o gerente quarda uma copia do backup no cofre e outra ele leva embora, e o full durante o fim de semana também é feito o mesmo.
Como observação final recomendo ter tudo isso em historico, e que também periodicamente seja quardado os dados da empresa em midias que nao serão apagadas, caso todo o resto falhe...
[30] Comentário enviado por danueli em 08/03/2010 - 14:54h
olá.
Sei que faz tempo este post.
mas encontrei isto agora só que não está a funcionar.
isto sao as minhas configurações (porque quando formatei os discos um deles ficou como directoria /backups e com flag de arranque)
HD_O=/dev/sdb5
HD_MTD=/backups
quando digito 1 (para restaurar o full) e depois hd
responde-me:
mount: /dev/sdb5 already mounted or /backups busy
mount: according to mtab, /dev/sdb5 is already mounted on /backups
total 8
drwxr-xr-x 2 root root 4096 2010-03-08 18:06 .
drwxr-xr-x 3 root root 4096 2010-03-08 18:06 ..
Qual a data do arquivo que quer restaurar? (dd-mm-aaaa)
digito a data que criei o fullbackup.
e responde-me novamente:
------------------------------------------------------
ATENÇÃO: FALHA na tentativa anterior tente novamente
------------------------------------------------------
[32] Comentário enviado por danueli em 15/03/2010 - 08:24h
éé... outro problema.. executando o script manualmente funciona
mas em crontab no log dá erro. :| o cron esta correto.
o que será? =|
Dá-me a entender que no cron ele nao detecta que é o user root que o está a fazer. mas está, porque segundo cron ao nao definir utilizador, assume o root.
[33] Comentário enviado por jorgeeb4 em 04/04/2010 - 18:09h
Caro danueli, pergunto se encontrou alguma solução para execução do scrip pelo cron?
Tenho o mesmo problema, e realmente o erro ocorre por que o scrip não consegue identificar o usuário que o esta executando.
[35] Comentário enviado por green-tec em 25/09/2010 - 12:23h
Estava vendo esse script de backup, muito bom por sinal... e lendo os posts de problemas e duvidas.. e sobre a questão de o backup funcionar no manual e no cron não rodar, se me permite dizer, é que o script do jhoni possui saida para tela, para vermos o andamento do backup e esse tipo de saida costuma dar problema no agendamento do cron..tira essa saida e testa para ver..
[38] Comentário enviado por GRAO_RJ_777 em 01/09/2011 - 01:03h
pra mim o backup full funcionou com excessão do ultimo laço if
if [ $? -eq 0 ] ; then
echo "Arquivo de backup mais antigo eliminado com sucesso!"
else
echo "Erro durante a busca e destruição do backup antigo!"
fi
}
que só esta retornando a menssagem "Arquivo de backup mais antigo eliminado com sucesso" mesmo quando ele deleta arquivos.
Porém ao excluir um usuário que é o caso de um desligamento da empresa o sistema verificar quais pastas estão dentro do home sendo assim não preciso realizar um backup geralzao do home e cada usuario ter a sua pasta compactada diminuindo e muito o tempo de restauração e tb não vou precisar acrescentar ou deletar pastas que forem criadas ou deletadas dentro do home
[42] Comentário enviado por luizquerino em 03/02/2012 - 09:25h
Bom dia primeiro post no VOL kk'
Preciso de uma dica, o script é incrível consigo usar normalmente manualmente, mais eu gostaria de alguma dica de como automatizar essa função para que seja feita todos os dias as 7:00 ao 12:00 as 19:00 e as 00:00.
Eu tentei usar o Cron mais não funcionou esta dando um erro.
[44] Comentário enviado por firewallsp em 19/06/2012 - 20:16h
Cara muito bom mesmo, me livrou a cara este script, já implementei no meu server...muito bom...roda blzinha...mas queria um esquema de envio de e-mail...teve um colega que fez um mas não roda..teriam alguma dica..
[46] Comentário enviado por marcelopkamanski em 16/11/2012 - 17:35h
boa tarde gente sou novo no forum, usei como base esse script para backup + fiz algumas mudanças conforme a utilizacao na empresa onde eu trabalho, estou com o seguinte problema...quando eu executo o script manualmente, o mesmo roda e realiza o backup conforme a configuracao que fiz, mas se eu configurar para que o crontab execute o backup programado, o backup não é realizado, mas no log do backup"/var/log/backup_diferencial.log" ele aparece que foi realizado com sucesso, mas quando é verificado na pasta de onde fica o backup, o arquivo nao existe, e nao sei o que pode ser acontece, pq o arquivo nao gera quando é programado, so gera somente quando o backup é executado manualmente. fico no aguardo...
[48] Comentário enviado por removido em 12/12/2014 - 15:09h
Massa. To fazendo um backup aqui no HD externo. Só alterei o formato da data. Quando ela estava com o x dd/dd/dd ele estava confundindo o / com outro diretório. Ai troquei pelo %F dd-dd-dd. Funfou está rodando aqui.
[49] Comentário enviado por marciosystens em 11/09/2015 - 13:12h
Muito boa a explicação!
E se eu quiser adicionar informação à saida do comando?
Por exemplo: Vou criar um arquivo de backup dos meus arquivos e salvar a lista dos arquivos tratados, com a data/hora e caminho do arquivo:
#Aqui salva a lista de arquivos compactados pelo tar
user@debian:~$ tar -czvf /etc /mnt/backup >> /var/log/backup.log
Parte do conteúdo de backup.log:
/etc/calendar/
/etc/calendar/default
/etc/chatscripts/
/etc/chatscripts/provider
O que eu gostaria que tivesse:
[ Máquina | usuario | data hora] <saída comando>
[debian | user | 11-09-2015 12:08:45] /etc/calendar/
[debian | user | 11-09-2015 12:08:45] /etc/calendar/default
[debian | user | 11-09-2015 12:08:46] /etc/chatscripts/
[debian | user | 11-09-2015 12:08:46] /etc/chatscripts/provider