+ Responder ao Tópico



  1. #1
    thomasitajuba
    Visitante

    Padrão Backup Total e Incremental no Linux

    Quero fazer um backup total de minha máquina na segunda e os outros incrementais dela na terca, quarta, quinta e sexta.
    Agendei o crontab para fazer isso todos os dias as 4h da manha, usando o comando:

    find \etc -mtime -1 -type f -print | \
    tar zcvf tmp\nomedobackup.tar.gz -t -

    onde o -1 significa que o linux vai procurar por arquivos modificados na faixa de 1 dia

    Só que o problema é que esses backups posteriores (incrementais) estao aumentando cada vez mais, ficando ate maiores que o backup total.
    Alguem sabe o que estou fazendo de errado e pode me ajudar??


    Testei também o comando
    tar -czf backup-$(date +%W_%y%m%d).tar.gz -g $(date +%W).snap CAMINHO_A_BACKUPEAR

    Observe o seguinte:
    o "-f" indica o nome do arquivo compactado que neste caso será algo como: backup_50_051214.ta.gz
    o "-g" é um arquivo de "snap" ele contém o timestamp de cada arquivo backupeado e caso o arquivo não exista ele será criado juntamente com um primeiro backup completo. Seu nome será algo como "50.snap"
    o "CAMINHO_A_BACKUPEAR" dispensa comentários ;-)

    Nos nomes dos arquivos observe que eu usei um "sub-shell" com o comando date onde o "%W" refere-se ao número da semana, onde o primeiro dia da semana é "segunda-feira" (ESTE É O SEGREDO DA COISA). Toda segunda-feira muda o número da semana e logo o arquivo de snap não existe forçando a criação do backup completo. Nos demais dias o arquivo de snap já existirá e portanto apenas os arquivos alterados serão backupeados.

    Mesmo assim ainda estou tendo problemas. Alguem pode me ajudar ?

    Agradeco muito a ajuda de todos
    Att. Thomas

  2. #2

    Padrão Backup Total e Incremental no Linux

    A minha primeira alternativa seria abrir o arquivo de backup e olhar seu conteúdo para se sertificar de que só estão indo aquivos recentes...
    O diretório que você está copiando não é de banco de dados, por exemplo, pois seus arquivos são atualizados a cada momento, então você teria sempre arquivos atuais para guardar...
    O esquema que você montou é interessante... :good:



  3. #3

    Padrão

    Aos que tiverem essa mesma dúvida, segue um script que montei.
    Obs. Para funcionar o envio automático de log por e-mail, tem que ter configurado o sendEmail

    -------------------------------------------------------
    #Criado por Kelwin Zils
    #Data 30-09-2019


    #CONFIGURACAO DATA/HORA
    hora=`/bin/date +%T`
    data=`/bin/date +%d-%m-%Y`
    data_alteracao=`/bin/date +%Y-%m-%d` #variavel para efetuar backups nos itens alterados hoje. Esta no formato 2019-Set-30
    mes=`/bin/date +%m-%Y`
    ano=`/bin/date +%Y`
    #CONFIGURACAO EMAIL LOG ERRO
    emailfail=/var/dados/scripts/emailfail.sh #caminho script email de hd cheio
    #CONFIGURACAO CAMINHO BACKUP
    tipo=Incremental #tipo da tarefa que será executada, indiferente o nome usado, apenas para organizar
    origem=/raid1/espelho/PROJETOS #origem dos arquviso a serem backupeados
    destino=/backup/PROJETOS/${tipo}_${data} #destino dos arquivos backupeados
    #CONFIGURACAO ARQUIVO DE LOG
    LOG=/raid1/log/${ano}/${mes}/backup/${tipo}/${tipo}_${data}.txt #caminho do arquivo de log gerado na rotina
    exec 1>>${LOG}
    exec 2>&1
    #------------------------------------------------------------------------------------------
    #INICIO DO SCRIPT
    let linhas=`df -h /dev/sdc1|wc -l`-1 #alterar /dev/sdc1 pela montagem correta do disco
    df -h /dev/sdc1|tail -$linhas|sed 's/%//'|sed 's/G//g'| #alterar /dev/sdc1 pela montagem correta do disco
    while read sistema Tam Usad Disp Uso Montado
    do
    echo $sistema $Tam $Usad $Disp $Uso $Montado
    if [ $Uso -gt 99 ] #define em % (porcentagem) a partir de que ponto o backup ira falhar e enviar aviso por email
    then
    echo "O HD ESTA CHEIO, ESPACO DISPONIVEL: $Disp"
    $emailfail #envia email avisando que o disco esta cheio e para o backup
    else
    echo "Backup "$tipo" Iniciado em:"
    echo "-"
    date
    echo "-"
    echo "----------"
    mkdir $destino #cria a pasta de destino do backup
    #BACKUPEIA
    find $origem -type f -newermt ""$data_alteracao"" -exec cp -ruva {} $destino \; #comando do backup, estudar sobre find, find --help
    echo
    echo "Tamanho do Backup"
    du -sh $destino #mostra o tamanho do backup na pasta destino
    echo
    echo
    echo "Backup "$tipo" Finalizado em:"
    echo "-"
    date
    echo "-"
    sleep 3
    #ENVIA LOG POR E-MAIL
    EMAIL_FROM="[email protected]" # remetente, conta que enviara as mensagens
    EMAIL_TO="[email protected]" # destinatario, conta que recebera as mensagens
    SERVIDOR_SMTP="smtp.gmail.com:587" #endereco SMTP, observar no exemplo o gmail utiliza a porta 587
    SENHA[email protected] #senha do remetente


    ASSUNTO="$HOSTNAME - $1"
    MENSAGEM=$2


    if [ "$1" == "" ] ;then
    ASSUNTO="Backup "$tipo" PROJETOS DE ${data}" #assunto da mensagem
    fi
    if [ "$2" == "" ] ;then
    MENSAGEM="Backup "$tipo" Concluido em ${data} | ${hora}. Log em anexo" #mensagem
    fi
    if [ "$3" != "" ] ;then
    MENSAGEM="$2 `cat $3`"
    fi
    sendEmail -f $EMAIL_FROM -t $EMAIL_TO -u "$ASSUNTO" -m "$MENSAGEM" -a $LOG -s $SERVIDOR_SMTP -xu $EMAIL_FROM -xp $SENHA #comando que envia a mensagem, obs: a parta do comando com -a $LOG é onde especifica o caminho que enviara anexo, no caso o arquivo de log. possivel alterar, estudar sobre sendEmail


    fi
    done


    #FIM DO SCRIPT
    #--------------------------------------------------------------------------------------------
    exit
    -------------------------------------------------------

    Para usar o mesmo script para backup completo, alterar a linha find $origem -type f -newermt ""$data_alteracao"" -exec cp -ruva {} $destino \; para cp -ruva $origem $destino e variável "tipo" configurar como Completo

    Feito isso, colocar na crontab, a minha esta assim:

    -------------------------------------------------------
    0 19 * * 1-5 root /var/dados/scripts/bkpincremental.sh #executa backup incremental de segunda e sexta-feira
    0 19 * * 6 root /var/dados/scripts/bkpcompleto.sh #executa backup completo no sabado
    -------------------------------------------------------

    Considerações finais sobre as funções do script.

    Ele inicia verificando se o disco de destino tem espaço suficiente para executar o backup, se sim ele executa um backup dos arquivos criados ou modificados na data atual, se não ele cancela e envia e-mail avisando o administrador. Para isso, precisa incluir um script onde aponta o $emailfail ou incluir no mesmo como funciona no fim do script em #ENVIA LOG POR EMAIL
    Obs. Prestar atenção nos itens em negrito, são as configurações para bom funcionamento do script.

    Espero ajudar, criticas construtivas são bem vindas.
    Abç