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="[email protected]"
#
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

12 opiniões sobre “Script simples para backup de BD MySQL”

  1. 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

  2. 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…

  3. 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

  4. 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.

  5. 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.

  6. 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

  7. 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.

  8. 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. :)

  9. 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. :)

  10. Opa, acho que eu que me expressei mal…
    “Você é bruto” é uma coisa boa…
    Uma expressão por aqui… :)
    Tipo Chuck Norris …

    Abração…

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *