De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.


Agendamento de backup com mysql via cron

Backup é uma coisa tão importante que deveria ser feita pelo presidente da empresa.

E backup do banco de dados então nem se fala.

Dependendo do tamanho do servidor, número de bancos de dados, etc, a coisa pode ficar bem complexa. O ideal então é criar procedimentos a serem executados a partir do cron, para não deixar nada de fora.

O comando abaixo é um exemplo de comando para backup de todos os bancos de dados sob o gerenciador MySQL.

mysqldump -u root -p senhadobancodedados \
          --single-transaction --lock-tables \
          --events --all-databases |\
          gzip > mysql.$data.sql.gz

Este comando contém um erro escandaloso. A senha do gerenciador MySQL está sendo fornecida na linha de comandos. Qualquer pessoa que tenha acesso ao servidor durante a execução deste comando, poderá obter a senha do gerenciador por meio de um simples comando ps.

Para evitar fornecer a senha do gerenciador do banco de dados na linha de comandos, siga os seguintes passos:

1. Edite o arquivo .my.cnf

 vi ~/.my.cnf 

2. Insira as seguintes linhas no arquivo:

[mysqldump]
host=localhost
user=(identificação do usuário)
password=(senha de acesso ao gerenciador)

O próximo passo é proteger este arquivo, para impedir sua visualização por pessoas não autorizadas. ISSO É MUITO IMPORTANTE!

$ chmod 600 ~/.my.cnf 

Com este comando, apenas o dono do arquivo .my.cnf terá acesso ao seu conteúdo.

Ainda não acabou. É preciso proteger também o arquivo ~/.mysql_history que contém o histórico dos comandos MySQL executados no sistema. Não é conveniente que os comandos que você usa para gerenciar seus bancos de dados estejam visíveis para pessoas não autorizadas. Alguns destes comandos podem conter senhas, e na mão das pessoas erradas, o pior pode acontecer.

$ chmod 600 ~/.mysql_history

Isto feito, o comando exemplificado acima, pode ser executado novamente, porém sem especificar a senha:

mysqldump -u root \
          --single-transaction --lock-tables \
          --events --all-databases |\
          gzip > mysql.$data.sql.gz

Eu sou meio neurótico com backups, e além do backup de todos os bancos de dados, como no exemplo acima, eu faço também backups individuais de cada um dos bancos de dados.

Vejamos um exemplo de script para backup de bancos de dados:

#!/bin/bash

cd /home/mysql

find . -mtime +30 | xargs rm

data=`date +%Y%m%d-%Hh%M`
echo $data

for bd in BD1 BD2 BD3 BD4 BD5
do
  mysqldump -u mysqlusr --single-transaction --lock-tables --events $bd | gzip > $bd.$data.sql.gz
done

mysqldump -u mysqlusr --single-transaction --lock-tables --events --all-databases | gzip > alldatabases.$data.sql.gz

rsync -av --delete /home/mysql/ /mysql

Este script grava os arquivos de backup no diretório /home/mysql. Como o número de arquivos cresce muito com o tempo, são mantidas apenas 30 versões dos arquivos de backup. As versões mais antigas são removidas com o comando find e xargs.

O backup dos bancos de dados é feito através do loop for e após o loop é feito um backup conjunto de todos os bancos de dados. Backup nunca é demais 😉

Ao final, eu faço uma cópia adicional, sincronizando o conteúdo de /home/mysql em /mysql. Estes dois diretórios residem em discos separados, adicionando mais um nível de segurança.

E tem mais, periodicamente todo este diretório é copiado para um servidor externo.

Agora a parte mais fácil, fazer o agendamento do backup via cron:

# crontab -e

Inserir na crontab a seguinte linha:

00    12,23  *   *   *   /usr/local/bin/mysqldump.sh

Esta linha instruí o sistema cron a executar o backup duas vezes por dia, às 12h e às 23h.

Dependendo da atividade do seu gerenciador de banco de dados, pode ser conveniente executar este script mais vezes durante o dia.

É importante destacar que o gerenciador MySQL possui recursos muito poderosos para backup e recuperação. Este procedimento é bastante simples e o objetivo é apenas ilustrar a execução de comandos como mysqldump sem a necessidade de especificar a senha na linha de comandos.

Veja também



Veja a relação completa dos artigos de Backup é uma coisa tão importante que deveria ser feita pelo presid