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-incrementalregistra 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 --versionreportaGNU tar(opcoes incrementais como--listed-incrementalsao especificas do GNU)- BSD tar (padrao no macOS) usa opcoes diferentes para alguns destes recursos
Por Que Usar --listed-incremental?
Conclusao:
--listed-incrementalrastreia 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
-gpara 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.snarcontem 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-incrementalna 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/nullpara-gna 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)
Se voce esquecer -g (--listed-incremental) na extracao, as exclusoes nao sao reproduzidas e arquivos removidos em uma geracao posterior permanecem. Sempre inclua quando precisar de uma restauracao exata 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=PADRAOpara exclusoes individuais e--exclude-from=ARQUIVOpara 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
--excludeantes 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:
-Cdefine o diretorio de destino,--strip-components=Nremove componentes iniciais do caminho, e--one-top-levelconfina 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 /restoreO que nao fazer
- Extrair um incremento antes do backup completo (o completo sempre vem primeiro)
- Manter o snapshot
.snarapenas 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.