It’s me
Script simples para backup de BD MySQL
Nos últimos dias estou até aprendendo um pouco melhor shell script para implementar um scriptizinho de backup de banco de dados MySQL.
Obs: Após ler o post, leia o comentário do Arthur Furlan abaixo porque vale a pena…
O script é bem simples, faz um dump em um arquivo SQL, compacta e apaga o SQL (deixando só o arquivo compactado). Para ficar mais divertido, mandei ele apagar os backups antigos (mantém só os 10 últimos (exagero!)) e mandar e-mails avisando o status do backup. Ele manda e-mails sempre, mas pelo código você vai ver como é simples mandar e-mails só em caso de erros. No início achei interessante mandar e-mails sempre para confirmar que o backup está funcionando legal.
Depois coloquei na cron do Linux (Ubuntu) para executar todos os dias às 2h da manhã (que você pode configurar de acordo com sua necessidade).
Segue abaixo (Atualização: seguindo a dica do Alexandre no comentário, passei a usar o gzip):
#!/bin/bash
U_PASTA="/home/user/backup" # < -- substitua pelo caminho onde vai salvar o backup
U_DATA=$(/bin/date +%Y%m%d%H%M%S)
U_CAMINHO="backup-$U_DATA.sql"
U_HOST="localhost"
U_USER="root"
U_PASSWORD="********"
U_DATABASE="minha_base_mysql"
U_EMAIL="meuemail@meudominio.com.br"
#
erro=""
#
cd $U_PASTA
#
#
# Faz o backup do MySQL
#
mysqldump -h $U_HOST -u $U_USER -p$U_PASSWORD $U_DATABASE > $U_CAMINHO
if [ $? -ne 0 ]
then
erro="Erro na geracao do SQL"
fi
#
#
# Compacta o arquivo
#
if [ "$erro" == "" ]
then
gzip $U_CAMINHO
if [ $? -ne 0 ]
then
erro="Erro ao compactar o SQL"
fi
fi
#
# Apaga arquivos antigos e mantem apenas os 'n' ultimos
#
n=10
c=0
for i in *.sql.gz
do
let c=$c+1
done
if [ $c -gt $n ]
then
for i in *.sql.gz
do
if [ $c -le $n ]
then
break
fi
rm $i
let c=$c-1
done
fi
#
if [ "$erro" == "" ]
then
erro="Backup efetuado com sucesso!"
subject="[Sucesso]"
else
subject="[Erro]"
fi
echo "$erro => $U_CAMINHO.gz" | mail -s "$subject Backup em $(/bin/date +'%d/%m/%Y %H:%M:%S')" $U_EMAIL
#
# Volta para a pasta anterior
cd -
Para agendar a execução, digite:
$ crontab -e
Vai abrir um editor de texto com o arquivo de configuração da cron. Daí você pode digitar algo como:
# m h dom mon dow command
00 02 * * * /home/user/backup_bd.sh
Onde backup_bd.sh é o arquivo do script que passei acima.
É isso. Espero que seja útil.
PS: Modifiquei algumas coisas na hora de publicar para não expor minha base, daí espero que não tenha cometido nenhum erro.
Outro PS: O script é meio amador, mas funciona legal. A base que faço backup gera um arquivo sql de 117Mb, compactado cai para 18Mb, e tudo isso em cerca de 15 segundos…
Veja também:
| Print article | This entry was posted by Andre Noel on 11/05/2009 at 11:22, and is filed under ubuntu. Follow any responses to this post through RSS 2.0. Você pode deixar uma resposta ou fazer um trackback do seu próprio site. |

há 10 meses atrás
Buenas
Tche, bacana o post
… mas fica como dica, ao invés de compactar com um ‘tar zcvf’, utiliza o gzip, ele deixa somente o arquivo compactado no disco, daí não precisa deletar o “.sql”
Forte abraço
há 10 meses atrás
Boa dica!
Abraços.
há 10 meses atrás
Pena não poder usar sh em hosts… tipo locaweb… com certeza um script de backup desses ajudaria… e você não precisaria desembolsar R$ 150,00 pila para requisitar o backup deles…
há 10 meses atrás
Documetário: INproprietário
É o melhor documetário nacional sobre softwre livre, video de 32 minutos, muito bem feito, imperdivel:
“INproprietário – O mundo do software livre” é um projeto experimental, trabalho de conclusão do curso de Comunicação Social com habilitação em Jornalismo dos ex-alunos Jota Rodrigo (Johnata Rodrigo de Souza) e Daniel Pereira Bianchi do Centro Universitário FIEO – UNIFIEO.
link para baixar:
http://www.mininova.org/tor/2571016
há 10 meses atrás
Olá Andre, tudo bom?
Gostaria de dar algumas dicas pra melhorar seu script. Eu acho desnecessário (isso não quer dizer que está errado) você verificar se está dando erro na aplicação.
Ai verificar o retorno do comando ($?) caso -ne, você exibe a mensagem e encerra o script `exit 1;`
Outra coisa legal, é fazer um arquivo de log pra registrar isso… Apenas direcionando para um arquivo o fluxo de texto;
Pra deixar seu script fantástico!!! só falta dar uma opção de fazer o backup remoto, ou para outro disco, ou para FTP, rsync, scp…
Mas tá bem legalzinho
abs.
há 10 meses atrás
Caraca Edgar, assim vou te contratar!
Muito obrigado pelas dicas. Por enquanto não preciso de backup remoto, mas vou dar uma olhada nisso mesmo…
Abraços.
há 10 meses atrás
Legal, muito bom. mas tive que alterar umas coisinhas para funcionar no meu ubuntu.
1) de #!/bin/sh para #/bin/bash (para chamar bash nomearquivo.sh)
2) no bloco onde exclui os arquivos e deixa apenas os mais novos troquei para *.sql.gz, pois o arquivo criado com o gzip é um .gz
há 10 meses atrás
Fala Marcondes,
Eu alterei o código pra gzip e esqueci de alterar a extensão…
Foi só aqui no blog a falha, mas valeu a dica!
Abraços.
há 9 meses atrás
A compactação podia ser feita com um único comando:
mysqldump … | gzip > $U_CAMINHO.gz
A parte de manter apenas os últimos N arquivos no diretório poderia ser feito direto pelo logrotate, sem precisar reescrever algo que já está implementado. Com isso o seu script fica com duas linhas, a do mysqldump e a do mail.
há 9 meses atrás
Rapaz, você é bruto, hein??
Valeu!
há 9 meses atrás
Eita… Talvez tenha parecido, mas não era essa a idéia e, se pareceu, peço desculpas.
O comentário foi feito com a melhor das intenções, acredite. Se você preferir, eu posso comentar de novo e você apaga o antigo ou pode simplesmente apagar o comentário antigo sem que comente de novo, você é que manda.
há 9 meses atrás
Opa, acho que eu que me expressei mal…
“Você é bruto” é uma coisa boa…
Uma expressão por aqui…
Tipo Chuck Norris …
Abração…