Atenção

Seu navegador (Internet Explorer, Firefox, etc) não suporta CSS ou este recurso está desabilitado.

Não é possível acessar corretamente esta página sem ele.




Início arrow Web Development arrow Fazendo backups automáticos de bancos de dados mysql usando shell script e crontab
Fazendo backups automáticos de bancos de dados mysql usando shell script e crontab Imprimir E-mail
Tag it:
Delicious
Furl it!
Spurl
NewsVine
Reddit
YahooMyWeb
Technorati
Rec6
Digg
Por Antonio Jozzolino   
03 de junho de 2008

Já faz alguns anos que utilizo o CVS e mais recentemente o SVN para controlar as versões dos projetos. A melhor definição que já ouvi é que estes sistemas funcionam como uma máquina do tempo, isto é, permitem que você resgate versões anteriores do seu código. Acabam funcionando como um backup também, embora esta não seja sua função prioritária.

Ótimo. O código fica protegido. Mas e o banco de dados?

Já faz um bom tempo também que automatizei a função de backup das tabelas mysql, através de shell scripts. Sempre gostei de programação batch, desde os tempos do velho DOS, devido à sua simplicidade, velocidade de criação e poder.

Melhorei uma função que já usava e agora ela guarda as versões anteriores do banco de dados no próprio servidor, como se fosse um  SVN para Mysql.

Requerimentos:

  • Um servidor que permita você logar via  SSH. Eu uso a Dreamhost já alguns anos, por enquanto estou satisfeito.
  • O servidor precisa permitir que você rode scripts shell scripts e tenha acesso ao mysql via linha de comando.

Definindo as variáveis:

 
#!/usr/bin/bash
 
#Variables
sr="localhost"                    #remote server
lg="nome_do_usuario_do_mysql"     #login name
pw="senha"                        #password
hs="all"                          #file name to store sql file
bk="$HOME/dbackup"                #path to store backup files
nw=$(date "+%Y%m%d")              #get date as string
nb=60                             #maximum number of files that will be keep

A primeira linha é o caminho do interpretador do shell script. Varia conforme a configuração do servidor. Este que aparece é para a Dreamhost.

Você vai precisar editar, colocando os seus valores nas seguintes variáveis:

  • sr: nome do seu servidor, normalmente "localhost", mas para a Dreamhost é sempre "mysql.dominio.com.br"
  • lg: nome do seu usuário do servidor mysql
  • pw: senha do seu usuário do servidor mysql

Se quiser, mude estas aqui com os seus valores:

  • hs: nome do arquivo temporário mysql
  • bk: nome do diretório onde ficarão armazenados as cópias do banco de dados. A variável $HOME deve ser mantida.
  • nb: número de cópias do banco de dados. Como a Dreamhost me dá mais de 20 gigas de espaço em disco, e todos os meus bancos somados e compactados ficam em 10 Mb, eu armazeno 60 cópias, uma para cada dia de dois meses.

Agora, a funçao:

 
function backup()
{
  echo "Getting data from mysql server"
  mysqldump -u$lg -p$pw -h$sr --add-drop-table --quote-names --all-databases --add-drop-database > "$HOME/$hs.sql"
  echo "Compressing $fn.sql.gz file ..."
  gzip -f "$HOME/"$fn.sql
  if [ -d $bk ]; then
    continue
  else
    mkdir $bk
  fi
  cp -f "$HOME/"$hs.sql.gz "$bk/$nw.sql.gz"
 
  a=0
  b=$(ls -t $bk)
  c=$nb
 
  for arq in $b; do
    a=$(($a+1))
    if [ "$a" -gt $c ];  then
      rm -f "$bk/$arq"
    fi
  done
}

O comando mais importante aqui é o mysqldump. Com estes parâmetros, ele vai pegar todos os bancos de dados que estão no servidor definido na variável "sr".

 
mysqldump -u$lg -p$pw -h$sr --add-drop-table --quote-names --all-databases --add-drop-database > "$HOME/$hs.sql"

O próximo comando compacta o arquivo sql gerado no diretório definido pela variável $HOME.

gzip -f "$HOME/"$fn.sql

O comando a seguir é quase cosmético. Ele cria o diretório para você automaticamente, caso ele não exista:

 
if [ -d $bk ]; then
  continue
else
  mkdir $bk
fi

Então, ele copia o arquivo gzipado para o diretório de backup, usando a data do sistema para gerar o nome, no formato AAAAMMDD.sql.gz. Ex: 20080603.sql.gz:

 cp -f "$HOME/"$hs.sql.gz "$bk/$nw.sql.gz"

E como não queremos estourar o limite do nosso espaço no servidor, o trecho a seguir faz a limpeza, deletando o arquivo de backup número $nb + 1, isto é, o arquivo mais velho criado anteriormente e de número maior do que o que você definiu na variável nb, ou seja, o 61 neste caso.

 
a=0
b=$(ls -t $bk)
c=$nb
for arq in $b; do
  a=$(($a+1))
  if [ "$a" -gt $c ];  then
      rm -f "$bk/$arq"
  fi
done

E para terminar, coloque na ultima linha do script:

 
backup

Salve em um arquivo, exemplo backup.sh, em formato texto puro, em formato UNIX (LF). Um editor gratuito que faz isto é o PSPAD.

Agora acesse o shell do seu servidor e rode o crontab.

crontab -e

E coloque no final do arquivo a linha:

0 6 * * * sh /home/user/backup.sh

Onde "home/user" é o caminho até seu arquivo backup.sh. Esta linha diz para seu servidor fazer uma cópia todo dia as 06:00 h. Se estiver usando o Nano como editor, tecle CRTL+o para salvar o arquivo, depois CRTL+x para sair.

Para restaurar o banco, primeiro descompate-o, depois rode o mysq.

 
gunzip -f "$HOME/dbbackup/nome_do_arquivo.sql.gz"
mysql -uusuario -psenha -hlocalhost < "$HOME/dbbackup/nome_do_arquivo.sql"

Para baixar o arquivo completo, clique aqui.

Importante: não coloque o script em um diretório que possa ser acessado pelo público, já que os dados de acesso ao banco estão nele.


Publique este artigo no seu site | Visto: 8930 | Imprimir

Comentários (4)
Comentários em RSS
1. 04-06-2008 14:04
 
Curiosidades
Muito bom esse post. Também uso o Dreamhost para alguns sites. Ha um tempo atrás estava horrível, mas agora parece que deu uma melhorada. 
 
De qualquer forma, parabéns pelo artigo!
 
Eduardo
2. 04-06-2008 14:13
 
O diferencial é o suporte
Nenhum host é perfeito. O que gosto da Dreamhost é o suporte. Já tive servidor próprio, mas o trabalho é enorme para ficar se defendendo dos ataques hackers. 
Fico contente que tenha gostado do artigo, pretendo escrever outros sobre shell script.
 
Antonio Jozzolino
3. 28-10-2008 06:40
 
Gostei do script
está muito bom mais ainda não testei acho que vai facilitar-me muito porque estou a criar um programa de conversão de dados mais com permissão so usuários inseridos na base de dados
 
Este endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo
4. 21-12-2009 12:16
 
Boa tarde
Muito bom seu posto, porém tenho uma dúvida. Como faria para que o script, gerasse um backup de um servidor remoto, em seguida importaria todos os dados daquele backup (seria pra mysql), mas se der pra fazer um full backup (arquivos, mysql, emails), em seguida restaurar naquele servidor (host) local
 
Este endereço de e-mail está sendo protegido de spam, você precisa de Javascript habilitado para vê-lo

Escrever comentário
  • Por favor, o assunto do seu comentário precisa ser relevante ao assunto do artigo.
  • Ataques pessoais serão deletados.
  • Por favor, não use os comentário para fazer propaganda de seu site ou será deletado.
Nome:
E-mail
Homepage
Título:
BBCode:Web AddressEmail AddressBold TextItalic TextUnderlined TextQuoteCodeOpen ListList ItemClose List
Comentário:



Código:* Code
Quero ser contactado por e-mail avisando sobre comentários

Powered by AkoComment Tweaked Special Edition v.1.4.6
AkoComment © Copyright 2004 by Arthur Konze - www.mamboportal.com
All right reserved

Última Atualização ( 03 de junho de 2008 )
 
Tag it:
Delicious
Furl it!
Spurl
NewsVine
Reddit
YahooMyWeb
Technorati
Rec6
Digg
< Anterior   Próximo >