tar na Pratica: Backups Incrementais e Exclusoes

tar na Pratica: Backups Incrementais e Exclusoes

O Que e um Backup Incremental com tar?

Conclusao: Ele arquiva apenas o que mudou desde a ultima execucao. --listed-incremental registra um snapshot e calcula o diff a partir dele.

Depois de aprender a comprimir e extrair com Fundamentos do tar, tres habilidades praticas vem a seguir:

  • Backups incrementais (diferenciais): capturar apenas mudancas, sem uma copia completa toda vez
  • Exclusoes: ignorar node_modules, caches e outros ruidos
  • Controle de destino e caminho: definir exatamente onde e em que profundidade os arquivos sao extraidos

Premissas deste guia

  • SO: Ubuntu (GNU tar)
  • tar --version reporta GNU tar (opcoes incrementais como --listed-incremental sao especificas do GNU)
  • BSD tar (padrao no macOS) usa opcoes diferentes para alguns destes recursos

Por Que Usar --listed-incremental?

Conclusao: --listed-incremental rastreia exclusoes e movimentacoes. --newer (comparacao por mtime) nao detecta exclusoes e gera restauracoes incorretas.

Existem duas formas de fazer backups incrementais:

Metodo Base Rastreia exclusoes Recomendado
--listed-incremental (-g) arquivo de snapshot sim melhor
--newer / --after-date mtime (data modif.) nao limitado

--newer apenas seleciona "arquivos mais novos que um determinado momento," entao nao consegue registrar arquivos excluidos desde a ultima execucao. Na restauracao, arquivos que voce removeu reaparecem. --listed-incremental registra o estado do diretorio em um arquivo de snapshot (convencionalmente com extensao .snar), reproduzindo o diff corretamente, incluindo exclusoes.

--newer baseado em mtime serve para um diff rapido, mas para gerenciamento de geracoes e restauracoes precisas, use --listed-incremental.

Como Criar um Backup Incremental

Conclusao: Continue apontando -g para o mesmo arquivo de snapshot. A primeira execucao e automaticamente nivel 0 (completo); as seguintes se tornam nivel 1 e acima (incrementais).

Nivel 0 (backup completo)

Na primeira execucao, quando o arquivo de snapshot nao existe, voce obtem automaticamente um backup completo.

$ tar -czg /backup/home.snar -f /backup/home-full.tar.gz /home/user/
  • -g /backup/home.snar: arquivo de snapshot (forma curta de --listed-incremental)
  • -c: criar / -z: gzip / -f: arquivo de saida
  • Apos esta execucao, home.snar contem o estado do diretorio registrado

Nivel 1 e acima (incremental)

Execute novamente com o mesmo arquivo de snapshot, e apenas as mudancas desde a execucao anterior serao arquivadas.

$ tar -czg /backup/home.snar -f /backup/home-inc1.tar.gz /home/user/

home.snar e atualizado a cada execucao e direciona o proximo diff. Use um nome de arquivo diferente (home-inc1, home-inc2...) por geracao.

Quando voce quer um backup completo toda vez

Aponte -g para /dev/null. Como o snapshot nunca e salvo (escritas em /dev/null desaparecem), toda execucao e um backup completo de nivel 0.

$ tar -czg /dev/null -f /backup/full.tar.gz /home/user/

Armazene o arquivo de snapshot separado dos dados de backup. Se perder o .snar, a cadeia de diff se quebra: a proxima execucao pode silenciosamente se tornar um backup completo, ou seu procedimento de restauracao falha.

Como Restaurar a Partir de Backups Incrementais?

Conclusao: Extraia na ordem das geracoes, comecando pelo nivel 0. Adicione --listed-incremental na extracao para que as exclusoes tambem sejam reproduzidas.

Restaure na ordem exata em que os arquivos foram criados.

$ mkdir -p /restore
$ tar -xzg /dev/null -f /backup/home-full.tar.gz -C /restore
$ tar -xzg /dev/null -f /backup/home-inc1.tar.gz -C /restore
$ tar -xzg /dev/null -f /backup/home-inc2.tar.gz -C /restore
  • Passe /dev/null para -g na extracao (o conteudo do snapshot nao e lido durante a restauracao, mas a flag ativa o modo --listed-incremental)
  • Neste modo, arquivos excluidos em um incremento tambem sao removidos do destino (uma restauracao fiel da geracao)
Inspecionando o conteudo antes

Liste o conteudo de um arquivo antes de extrair.

$ tar -tzf /backup/home-inc1.tar.gz | head

Um arquivo incremental inclui entradas de diretorio junto com os arquivos alterados.

Como Especificar Padroes de Exclusao

Conclusao: Use --exclude=PADRAO para exclusoes individuais e --exclude-from=ARQUIVO para uma lista. Coloque as opcoes antes dos caminhos de origem.

Excluir individualmente

$ tar --exclude='*.log' --exclude='node_modules' \
      -czf project.tar.gz project/
  • Padroes sao globs (* ? [...]) comparados com os nomes dos membros no arquivo
  • Coloque --exclude antes do caminho de origem (project/); colocado depois, pode nao ter efeito

Manter exclusoes em um arquivo

Quando ha muitas, use um padrao por linha.

$ cat > exclude.txt <<'EOF'
*.log
*.tmp
node_modules
.cache
EOF

$ tar --exclude-from=exclude.txt -czf project.tar.gz project/

A forma curta de --exclude-from e -X.

Opcoes integradas uteis

Opcao Exclui
--exclude-vcs .git / .svn / CVS e outros metadados de VCS
--exclude-caches diretorios que contem um arquivo CACHEDIR.TAG
$ tar --exclude-vcs --exclude='*.log' -czf src.tar.gz src/

Como Controlar o Destino e a Profundidade do Caminho?

Conclusao: -C define o diretorio de destino, --strip-components=N remove componentes iniciais do caminho, e --one-top-level confina tudo sob um diretorio pai.

Definir o destino (-C)

$ tar -xzf project.tar.gz -C /opt/app

A protecao basica contra arquivos se espalhando pelo diretorio atual. Crie o destino antes.

Remover diretorios iniciais (--strip-components)

Quando um arquivo tem um nivel de profundidade, como project-1.0/src/..., remova esse nivel na extracao.

$ tar -xzf project-1.0.tar.gz --strip-components=1 -C /opt/app

Isso remove project-1.0/ e extrai diretamente em /opt/app/src/.... Essencial para colocar um tarball de codigo-fonte do GitHub em um local fixo.

Confinar a um diretorio pai (--one-top-level)

Para um arquivo cujos arquivos se espalham no nivel superior, force tudo sob um unico diretorio.

$ tar -xzf messy.tar.gz --one-top-level=extracted

extracted/ e criado e tudo e extraido dentro dele (sem bagunca).

Na Pratica: Um Padrao de Backup Diario

Conclusao: Execute um nivel 0 semanal e um nivel 1 diario. Combine uma lista de exclusao com um destino fixo para reduzir acidentes.

Template para copiar e colar

# Completo semanal (exclua o .snar primeiro se quiser resetar o snapshot)
tar --exclude-from=/etc/backup/exclude.txt \
    -czg /backup/home.snar \
    -f /backup/home-$(date +%Y%m%d)-full.tar.gz \
    /home/user/

# Incremental diario (continue reutilizando o mesmo .snar)
tar --exclude-from=/etc/backup/exclude.txt \
    -czg /backup/home.snar \
    -f /backup/home-$(date +%Y%m%d)-inc.tar.gz \
    /home/user/

# Restaurar (completo depois incremental; exclusoes reproduzidas)
tar -xzg /dev/null -f /backup/home-...-full.tar.gz -C /restore
tar -xzg /dev/null -f /backup/home-...-inc.tar.gz  -C /restore

O que nao fazer

  • Extrair um incremento antes do backup completo (o completo sempre vem primeiro)
  • Manter o snapshot .snar apenas junto aos arquivos (ponto unico de perda)
  • Extrair diretamente em um diretorio de producao sem definir -C

Para agendamento, veja Fundamentos do cron; para planejamento de capacidade, veja No space left on device.

Proximas Leituras