Servidor Linux


Backups automáticos mysql com shell script e crontab

Posted in Backup,MySQL,Shell Scripts por eduroges em junho 4, 2008
Tags: , , ,

Requerimentos:

  • Um servidor que permita você logar via  SSH.
  • 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"

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.

Fonte: http://www.sgd.com.br