Backup automático do postgres + rsync para outra máquina

outubro 15th, 2009 por caferrari Leave a reply »

Aqui vou exemplificar a solução que usamos para fazer backup diário dos nossos bancos de dados, este backup é armazenado em um servidor fora do país. para fazer a sincronia, usamos o rsync.

1) Configurando login automático via chaves digitais no nosso servidor de armazenamento

Primeiro você tem que gerar as chaves no seu servidor de banco, com o usuário do banco de dados, no meu caso é o usuário “postgres”.

Você será perguntado por uma senha, deixe em branco e confirme:

$ su postgres
$ ssh-keygen -t dsa

Agora você terá sua chave, copie-a para seu servidor que irá armazenar o backup

$ scp ~/.ssh/id_dsa.pub user@server_bkp:~/

Agora acesse seu servidor via ssh e adicione a chave pública na lista de chaves autorizadas do ssh

$ ssh user@server_bkp
$ cat ~/id_dsa.pub >> ~/.ssh/authorized_keys

Volte para o seu servidor de banco no usuario do postgres e teste:

$ ssh user@server_bkp

Se você conseguiu acessar o server de backup sem digitar senha, continue no passo 2, senão, de uma revisada. qualquer dúvida comente!.

2) Instalando o rsync e script de backup

Para instalar o rsync no debian é bem simples:

$ aptitude install rsync

No nosso banco de dados os backups são feitos diariamente as 19 horas, e usamos a pasta /backup para armazena-los:

$ mkdir /backup
$ touch /backup/backup.sh
$ chmod +x /backup/backup.sh
$ chown postgres:postgres /backup -R

Agora, edite o arquivo backup.sh e coloque o conteúdo:

#!/bin/bash
 
PASTA=$(date +%m%Y)
DATA=$(date +%Y%m%d)
DIA=$(date +%d)
 
mkdir /backup/$PASTA
mkdir /backup/$PASTA/$DIA
 
LIST=$(psql -l | awk '{ print $1}' | grep -vE '^-|^\(|^List|^N[o|a]me|template[0|1]')
for d in $LIST
do
        pg_dump -i -h 127.0.0.1 -p 5432 -U postgres -F t -b -f "/backup/$DATA-$d.backup" $d
        tar -zcf /backup/$PASTA/$DIA/$DATA-$d.tar.gz /backup/$DATA-$d.backup
        rm /backup/$DATA-$d.backup
        /usr/bin/rsync -avzh --delete --progress --update /backup/ user@server_bkp:~/
done

faça um teste e rode o script com o user do postgres:

$ su postgres
$ /backup/backup.sh

Se tudo ocorrer bem, é só adicionar no crontab para executar quando você quiser:

$ su
$ pico /etc/crontab

e adicionar:

0 19    * * *   postgres    /backup/backup.sh

Reinicie o cron e o backup será feito todos os dias as 19 horas.

4 comments

  1. Roger Wagner disse:

    Interessante a solução, tenho uma parecida.
    Mas isto tem o enfoque o backup de dump full, certo?
    E se fosse incremental, teria como ser? E o restore dai?

    Somente levantando problemas que enfrento.
    Mas do mesmo mantenho o elogio pelo post.

  2. Diego disse:

    O que é melhor?
    1. Fazer dump do banco e jogar para o server de backup.
    2. Utilizar replicação de banco.

  3. Carlos André Ferrari disse:

    @Diego

    Depende!..

    Se você tem replicação, você pode usar os dois bancos para aumentar a performance geral dos sistemas e ainda usar de backup… além de, em caso de pane, você já teria um banco pronto para assumir…

    O backup para outro lugar é uma solução bem mais “barata”, e você pode – e deve – ter, mesmo se estiver usando replicação. A desvantagem é, que se der algum problema, o tempo para restaurar tudo é menor.

    []’s

  4. Diego disse:

    Atualmente tenho um plano de backup (full) externo na empresa de hospedagem que utilizo. Se der qualquer problema com o server basta repor o hardware e voltar o backup, é quase um Ghost.
    Mas estou pensando em mudar a infra-estrutura, visto que as requisições aos sites que hospedamos estão aumentando e tudo roda em apenas um servidor dedicado, vários serviços concorrendo por memória e processamento, não é legal.
    Estou gostando da sua abordagem com o nginX e agora essa dica simples de backup do banco.
    Parabéns pelo blog, já está nos favoritos.

Deixe uma resposta