Backups automáticos mysql com shell script e crontab
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: www.sgd.com.br