Hoje neste artigo vamos aprender a fazer o backup agendado do MySQL (ou MariaDB) de forma automática via CRON do Linux.
Há Alguns dias fizemos a instalação do GLPI e vou usar este ambiente como base para fazermos a configuração do backup automático do banco de dados, mas não se preocupe o passo a passo abaixo servirá para qualquer base que você já tenha criada em seu ambiente.
Vamos usar o CRON que é um utilitário do Linux que permite aos usuários agendar a execução automática de tarefas em momentos específicos. O termo “crontab” é uma abreviação de “cron table”, onde “cron” é o serviço de agendamento de tarefas no Linux.
Para usarmos de forma correta o CRON precisamos entender um pouco de sua estrutura para o agendamento das horas, a sua sintaxe é:
# Sintaxe do Cron
minuto hora dia_do_mês mês dia_da_semana comando
minuto: o
s minutos em que a tarefa será executada (0 a 59).hora: a
s horas em que a tarefa será executada (0 a 23).dia_do_mês
: O dia do mês em que a tarefa será executada (1 a 31).mês
: O mês em que a tarefa será executada (1 a 12) ou usando nomes abreviados como jan, fev, mar, etc.dia_da_semana
: O dia da semana em que a tarefa será executada (0 a 6, sendo 0 domingo) ou usando nomes abreviados como sun, mon, tue, etc.comando
: O comando ou script a ser executado.
# Exemplo de utilização
0 2 * * * /caminho/do/comando
No exemplo acima este agendamento executa o comando especificado todos os dias às 2h da manhã (hora 2, minuto 0)
Difícil né? Também acho por isso às vezes uso o Site Crontab Guru, Fica a dica 😉
Bom agora sabemos para que serve o CRON, então vamos para o que interessa.
Eu prefiro sempre fazer um usuário novo no banco de dados com as permissões restritas apenas as necessárias para o backup do ambiente, mas se você quiser usar o root, fique a vontade.
Para realização do backup do ambiente o usuário precisa ter ao menos as permissões abaixo:
SELECT: Permite que o usuário selecione dados das tabelas que serão incluídas no backup.
SHOW VIEW: É necessário para que o mysqldump possa obter informações sobre views, caso existam.
LOCK TABLES: Esta permissão é necessária para bloquear tabelas durante o processo de backup, garantindo a consistência dos dados.
RELOAD: Para recarregar as configurações do servidor, o que é útil durante a restauração do backup.
FILE: Permite ao usuário gravar arquivos no servidor, o que é necessário para criar o arquivo de backup.
PROCESS: Essa permissão permite ao usuário ver todos os processos em execução, útil para verificar se há bloqueios durante o backup.
Vamos criar o usuário e aplicar as permissões acima.
# Acessando o Mysql
mysql -u root -p
Enter password:
# Criando o usuário (não esqueça de trocar a senha)
CREATE USER 'backup'@'localhost' identified by '123456';
# Aplicando as permissões
GRANT SELECT, SHOW VIEW, LOCK TABLES, RELOAD, FILE, PROCESS ON *.* TO 'backup'@'localhost';
# Forçando o reload das permissões
flush privileges;
# Sair
exit;
Bom agora temos o usuário que vai rodar o backup, e já podemos ajustar os caminhos, eu gosto particularmente de criar o caminho /backup nos meus servidores e colocar dentro deste caminho meus backups
# Criando a pasta
mkdir /backup
Agora tudo que vamos fazer é no CRON para criar o agendamento, antes de colocar a linha aqui vou explicar algumas coisas.
Vamos fazer o backup e já compactar por meio do gzip para economizar espaço, também vamos usar a expressão regular $(date +\%Y\%m\%d\%H\%M\%S) que é par adicionar a data e hora do backup em no nome do nosso arquivo.
O utilitário que irá fazer o backup é o mysqldump que é uma ferramenta que já é instalada ao instalar o Mysql ou o MariaDB.
Você vai precisar saber qual o nome da base de dados que você quer fazer o backup, no meu caso a base se chama “glpi” e o usuário que vou usar é o backup que criamos anteriormente, então para fazer o backup as 22hs da noite, minha linha do cron ficaria assim.
# Abrindo o CRON
crontab -e
# Na ultima linha adicione
0 22 * * * mysqldump -u backup -p'123456' glpi | gzip > /backup/glpi_$(date +\%Y\%m\%d\%H\%M\%S).sql.gz
Ou seja, todo dia as 22hs o agendamento vai chamar o utilitário “mysqldump” passando o usuário “backup” com a senha “123456” e pedir para fazer o backup da base glpi, este backup após executado vai ser compactado e salvo no caminho /backup/glpi_datahora.sql.gz.
Ficou mais fácil agora?
Então aqui vai mais uma dica, se a gente deixar este backup da forma que esta, uma hora o disco vai encher, pois ele nunca vai ser apagado de forma automática, então eu também fiz uma linha para manter somente os últimos 7 dias de backup em disco, mas você pode fazer o tempo que você preferir.
No CRON adicione também a linha abaixo, ela será executada as 23hs, vai procurar os arquivos criados a mais de 6 dias (sem contar o dia de hoje) e vai apagar.
#Limpeza de backups antigos
0 23 * * * find /backup/* -mtime +6 -type f -delete
No Final meu CRON ficou assim.
#backup bancos
0 22 * * * mysqldump -u backup -p'123456' glpi | gzip > /backup/glpi_$(date +\%Y\%m\%d\%H\%M\%S).sql.gz
#Limpeza de backups antigos
0 23 * * * find /backup/* -mtime +6 -type f -delete
Lembre-se se salvar o arquivo e reiniciar o serviço do CRON para que as alterações tenha efeito.
# Reiniciando o CRON
systemctl restart cron
Legal, mas e se eu precisar restaurar um backup? Como fazer?
É bem simples, você vai precisar primeiro descompactar o backup por meio do gunzip, e depois importar este backup para o banco
# Descompactando o backup
gunzip /backup/arquivo.sql.gz
# Importando para o SQL
mysql -u root -p nomedabase < /backup/arquivo.sql
Isso é tudo, Espero ter ajudado 🙂