Arquivo incremental de backup por data

3

Existe alguma ferramenta de backup que suporte backup parcial por data? O que quero dizer é que tenho algumas unidades pequenas, como em um laptop que não pode conter uma cópia completa de todos os arquivos em uma unidade externa de 2TB. Eu quero manter os arquivos mais recentes, que geralmente são os que eu estou trabalhando, no laptop. Mas, ao mesmo tempo, quero poder sincronizar outras unidades com espaço de armazenamento limitado. Portanto, cada pequena unidade deve conter arquivos que foram criados ou modificados além de uma determinada data, como 3 meses atrás. Digamos que eu tenha 2 laptops e cada um tenha um tamanho de disco diferente. Para o laptop com uma unidade menor, posso apenas querer que os arquivos do último mês estejam presentes. Todos os arquivos em ambos os laptops devem ter um backup na unidade externa grande, junto com todos os outros arquivos arquivados com mais de 3 meses de idade. Portanto, a unidade externa deve espelhar as duas unidades menores e mantê-las em sincronia. Eu tentei usar unison , mas parece não suportar backup por data. Talvez rsync com alguns scripts de shell funcione, mas quero verificar primeiro se existe uma solução antes de implementar uma nova.

    
por Reed G. Law 31.05.2014 / 10:24

1 resposta

4

Eu não usei programas dedicados para isso, mas é muito fácil organizar e ajustar com uma combinação de cron, bash, tar ( dumps incrementais ) e / ou rsync. Na minha opinião, existem duas soluções ótimas e eu uso ambas ou uma delas, dependendo do contexto. Eu acho que o primeiro será mais apropriado para você, mas vou descrever os dois aqui.

Arquivos de tar incrementais

O núcleo dessa solução é um script que pode se parecer com isso:

#!/bin/bash

# You will need to set the variables $EXCLUDE, $DATA and $BACKUPS
# as environment variables, in ~/.bashrc or somewhere.

OPTS="--create --no-check-device --bzip2 --verbose -X $EXCLUDE"
for d in 'ls $DATA'; do
    SNAPSHOT=$BACKUPS/$d.snar
    if [ $1 == full ]; then
        echo "Archiving $d (full)..."
        rm -rvf $SNAPSHOT
        ARCHIVE=$DATA/$d.'date --iso-8601'.full.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
    if [ $1 == increment ]; then
        echo "Archiving data/$d (increment)..."
        ARCHIVE=$DATA/$d.'date --iso-8601'.tar.bz2
        tar $OPTS --file=$ARCHIVE --listed-incremental=$SNAPSHOT $DATA/$d
    fi
done

Isto assume que existem subdiretórios em $DATA e backups cada um em um arquivo separado. Se sua configuração for diferente, personalize o script.

Você pode agendar o backup no seu crontab assim:

# m  h  dom mon dow   command
  44 1  1   */2 *     ~/bin/backup_data full > ~/backups/data/logs/'date --iso-8601'.full.log 2>&1
  44 5  *   *   *     ~/bin/backup_data increment > ~/backups/data/logs/'date --iso-8601'.log 2>&1

Como você pode ver, neste caso, um backup completo é criado uma vez a cada dois meses, e backups incrementais a partir desse despejo completo são criados todos os dias. Problemas com arquivos incrementais no tar começam quando você perde um arquivo ou até mesmo altera um timestamp. Portanto, é prudente criar um despejo completo de vez em quando.

No que diz respeito à sincronização entre máquinas e a remoção de arquivos antigos, você deve separar essa tarefa do backup em si, já que ela é realmente ortogonal. Claro, use o rsync para sincronização, sem a opção --delete , para que você não perca nenhum dado na unidade externa grande. Então, seu comando para isso pode ser:

rsync -av /backups/data /mnt/external

se a unidade externa estiver montada no laptop. Caso contrário, você precisará fazer isso pela rede da seguinte forma:

rsync -av /backups/data user@external:/backups/data

Se você quiser limpar os arquivos com mais de 90 dias do seu laptop, faça o seguinte:

find /path/to/files -type f -mtime +90 -delete

Novamente, coloque essas coisas no seu crontab.

Backups incrementais com rsync

Você pode usar o rsync sozinho para fazer um backup incremental das coisas. Eu gosto especialmente de usar snapshots com timestamp e hardlinks para isso, e é apenas um comando. Aqui está um exemplo próximo ao que eu uso normalmente:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/'date --iso-8601 -d "one day ago"' /data/ /backups/data/'date --iso-8601'/

que basicamente cria links físicos para o instantâneo do dia anterior (aquele dado por --link-dest ) para arquivos que não foram alterados. Se você estiver executando irregularmente, você pode usar um link simbólico que aponte para o último snapshot, e atualizar esse symlink após o backup, da seguinte forma:

rsync --verbose --progress --stats --human-readable --archive --link-dest=/backups/data/last /data/ /backups/data/'date --iso-8601'/ && rm -rvf /backups/data/last && ln -vs /backups/data/'date --iso-8601'/ /backups/data/last

Além disso, você precisará organizar a sincronização com a unidade externa e excluir os instantâneos antigos. Isso, geralmente, é feito da mesma maneira que na primeira solução descrita acima. No entanto, ao rsyncing instantâneos entre máquinas, certifique-se de usar as opções -H para preservar os hard links.

Resumo

Em comparação com a solução que usa tar , a segunda em minha mente é um pouco mais simples de gerenciar e tem todos os arquivos disponíveis o tempo todo. A utilização de arquivos, por outro lado, faz uso da compactação, usa menos inodes e possui outras vantagens em máquinas que não são servidores.

Novamente, faça tudo isso no crontab sempre que possível, para que você não precise se lembrar disso. Se você não tiver o laptop ligado o tempo todo, escolha um horário em que ele seja usado com frequência e, talvez, faça isso várias vezes ao dia, para que pelo menos algumas das tarefas do cron iniciem. Melhor ainda, use algo como anacron .

Você também pode executar o script de backup manualmente e detalhar as datas nos nomes de arquivos / diretórios se quiser fazer incrementais mais de uma vez por dia. Obviamente, você precisará brincar com essas soluções para ajustá-las ao seu caso de uso. Espero que isso ajude.

Atualizar : uma essência com um script de exemplo: link

    
por 05.06.2014 / 18:26