Tips Infra

Backup MySQL de forma automática

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: os minutos em que a tarefa será executada (0 a 59).
  • hora: as 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 🙂

0 0 votes
Article Rating
Subscribe
Notify of
guest

Esse site utiliza o Akismet para reduzir spam. Aprenda como seus dados de comentários são processados.

0 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
Ver todos os comentários
0
Adoraria sua opinião, por favor, comente.x