Acesso direto ao conteúdo
Logotipo Dicas-L, por Ricardo Burile

Busca

Visite também: Segurança Linux ·  UnderLinux ·  VivaOLinux ·  LinuxSecurity ·  NoticiasLinux ·  BR-Linux ·  SoftwareLivre.org ·  [mais]   
 

Você está aqui: Home  → Arquivo Dicas-L

 

Assine a Lista Dicas-L

Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.

Criando backups incrementais usando rsync e hardlinks

Colaboração: Marcelo Gonçalves Diotto

Data de Publicação: 09 de março de 2011

Há algum tempo estou testando ferramentas de backups para o linux, já testei várias ferramentas de backup e a que mais tinha me agradado até o momento era a rdiff-backup.

O rdiff-backup é uma ferramenta de backup diferencial que, na primeira vez que é executada realiza um espelho do diretório a ser copiado (algo similar ao rsync), nas próximas vezes que ele é executado ele realiza uma comparação entre o último backup feito e os dados atuais, realizando somente um backup das diferenças, com isso economiza-se espaço do servidor e pode-se ter a possibilidade de restaurar o backup de vários dias diferentes de seus dados, algo parecido com o que o TimeMachine do Mac faz.

O problema é que, embora eficiente, o rdiff-backup depende do software instalado tanto no cliente quando no servidor e normalmente suas versões não são compatíveis, sendo assim muitas vezes torna-se necessário baixar uma versão específica e compilá-la manualmente.

Outro problema é que a restauração de dados antigos não é são simples, é necessário utilizar o próprio rdiff-backup para isso e a restauração é um pouco demorada.

Não contente resolvi fazer alguns testes de backups diferenciais usando o rsync e links simbólicos. Com isso criei uma ferramenta denominada bkptool que é capaz de realizar backups diferenciais usando o recurso de hardlinks e com o rsync trabalhando pra fazer a sincronização.

O intuito da ferramenta é bem simples, basicamente você deve rodá-la passando três parametros, como no exemplo a seguir:

  # bkptool /var/www/ /backup/ www

O primeiro parâmetro indica a pasta a ser feito o backup

O segundo parâmetro indica o destino do backup (neste caso o mapeamento via NFS de meu NAS)

O terceiro é uma indicação do id do backup

Toda vez que o comando de backup for executado será criada uma pasta dentro do destino com o nome <id>-<ano>-<mes>-<dia>-<hora>-<minuto>-<segundo>. Para o comando do exemplo acima, seriam criadas pastas como:

  www.2011-02-24-14-16-46
  www.2011-02-25-13-48-29

Deste modo quando houver a necessidade de restaurar um backup é necessário simplesmente acessar a pasta do respectivo dia e copiar seu conteúdo de volta ao destino, sem a necessidade de programas adicionais.

Download do bkptool: http://www.diotto.net/downloads/bkptool

Segue abaixo o código fonte do mesmo:

  #!/usr/bin/env bash
  ORIGEM=$1
  DESTINO=$2
  NOME=$3
  QTDE=${4:-60}
  CONTADOR=0
  PLATFORM=$(uname)
  if [ "$ORIGEM" == "" -o "$DESTINO" == "" -o "$NOME" == "" ]; then
        echo "bkptool - Ferramenta de Realização de Backups Diferenciais"
        echo
        echo "$0    [qtde=30]"
        echo
        echo " - Origem            : pasta a ser feito o backup"
        echo " - Destino           : pasta de destino do backup"
        echo " - Id                : identificador do backup, deve ser apenas uma palavra"
        echo " - Qtde (opcional)   : quantidade de backups anteriores (alám do atual) que devem ser mantidos na pasta de destino (Padrão: 30)"
        echo
        exit 1
  fi
  if [ ! -d $ORIGEM ]; then
        echo "Pasta de origem \"$ORIGEM\" inexistente"
        exit 1
  fi
  if [ ! -d $DESTINO ]; then
        echo "Pasta de destino \"$DESTINO\" inexistente"
        exit 1
  fi
  ULTIMO_BACKUP=`find $DESTINO -maxdepth 1 -name "$NOME.*" | sort -nr | head -n 1`
  find $DESTINO -maxdepth 1 -name "$NOME.*" | sort -nr | tail -n +`expr $QTDE + 1` | while read antigo; do
        rm -rf "$antigo"
  done
  ID=`date +%Y-%m-%d-%H-%M-%S`
  BACKUP_ATUAL="$DESTINO/$NOME.$ID"
  echo "- Criando pasta $BACKUP_ATUAL"
  mkdir $BACKUP_ATUAL
  if [ "$ULTIMO_BACKUP" != "" ]; then
        echo "- Copiando pasta $ULTIMO_BACKUP para $BACKUP_ATUAL"
        if [ "$PLATFORM" == "FreeBSD" ]; then
                pasta=$(pwd)
                cd $ULTIMO_BACKUP
                pax -rwl -pe . $BACKUP_ATUAL
                cd $pasta
        else
                cp -al $ULTIMO_BACKUP/. $BACKUP_ATUAL
        fi
  fi
  echo "- Executando rsync de $ORIGEM para $BACKUP_ATUAL"
  rsync -a --delete $ORIGEM/ $BACKUP_ATUAL

Espero que esta ferramenta seja útil e também peço que, quem encontrar bugs ou tiver melhorias a sugerir me enviem para que eu implante em novas versões.

Veja a relação completa dos artigos de Marcelo Gonçalves Diotto

Formato PDF
Newsfeed RSS
Formato para impressão
PDF RSS Imprimir

Referências Adicionais

Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.

Avalie esta dica

  • Currently 2.99/5
  • 1
  • 2
  • 3
  • 4
  • 5

Avaliação: 3.0 /5 (910 votos)

Opinião dos Leitores

Flavio Lopes
07 Jul 2011, 18:40
Olá,
Artigos são sempre bons para estimular o pensamento e propiciar um novo ponto de vista sobre um determinado assunto.

Não é uma crítica, absolutamemnte, mas a melhor ferramenta da atualidade para backups (e para fazê-lo de forma profissional), sem dúvida é o Bacula (www.bacula.org).

Porque estou dizendo isto? Supondo que dentro do diretório que você quer fazer o Backup, você queira excluir determinado(s) arquivo(s) e/ou diretório(s), como quem está usando seu script deveria fazer?


Carlos Dias
13 Mar 2011, 12:29
O comando "pax" qual a função dele?
Evandro Neves
13 Mar 2011, 12:27
Esse artigo é praticamente uma cópia de http://lovato.com.br/2011/02/utilizando-o-rsync-para-fazer-backup-estilo-time-machine/

Eu usei o link acima para fazer a mesma coisa em meu computador.
Francisco Neto
13 Mar 2011, 03:47
Olá

deixo a minha sugestão de uso, faubackup.

utilizo ele com o rsync (para fazer o espelho) e o faubackup para fazer o backup diferencial.

tem dado certo...recomendo.

abraço.
Francisco.
Pedro Matos
10 Mar 2011, 17:30
Excelente ferramenta, estou usando um script enorme para fazer esse mesmo trabalho e de forma mais trabalhosa.

Porem esta dando erro no CentOS:

bkptool: line 49: syntax error: unexpected end of file

O que posso fazer?
Marcelo Oliveira
10 Mar 2011, 11:02
Uso atualmente o pdumpfs para isso. Normalmente com um hd externo. Mas agora que estou migrando p/ servidores virtuais com ESXi4 nao tenho mais acesso a portas usbe e-sata. Por isso, estou pesquisando outra ferramentaspara fazer o mesmo trabalho. Achei pdumpfs-rsync mas este deu erro aqui, logo no primeiro teste e e perdi a fé. Esta ferramenta portanto caiu do céu ou melhor da Dicas-L.
Vou testar e breve. Parabéns pela implementação. Abraço
Marco D Andrade
09 Mar 2011, 21:18
Este conceito é extremamente interessante e pratico!

A alguns natais passados, eu tirei este coelho da cartola, para uma replicação de banco PostgreSQL, e me surpreendi ao encontrar uma solução já documentada com estes requisitos.

http://rsnapshot.org/

E o ponto mais interessante de todos é que mesmo em replicações de grandes arquivos o rsync faz o correto tratamento e separação!

Mas como já é sabido. A vantagem do *nix é a simplicidade com que se ligam os recursos!

Parabens pela eficiência e simplicidade com que você fez sua implementação!!

Marco Antonio
Thiago
09 Mar 2011, 14:57
Olá,

esse script pode ser usado para um backup completo do HD, e como seria para restaurar os dados nesse caso?

obrigado
Rômulo
09 Mar 2011, 07:04
Em:
echo " - Qtde (opcional) : quantidade de backups anteriores (alám do atual) que devem ser mantidos na pasta...

corrigir para: ...(além do atual)...
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script
Treinamentos, Consultorias e Soluçoes em TI. Baseados em softwares livres e padrões abertos para ambientes de missão crítica

Submarino.com.br

As Palavras Mais Comuns da Língua Inglesa (2ª edição)