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