Click here for the English Version
Introdução
Uma das tarefas mais importantes para um administrador de banco de dados é o backup de sua(s) database(s).
O objetivo deste post é criar um script de backup que ficará agendado no crontab e executará as rotinas de backup todos os dias as 02:00 a.m. O usuário “backup” só terá privilégios necessários para efetuar o backup.
Neste post, é adotado o CentOS 5 como referência. Mas versões mais novas também deverão funcionar sem problemas.
Criação e configuração do Usuário ‘backup’
Para criarmos o usuário, precisamos de privilégios administrativos no MySQL. Neste exemplo utilizaremos o usuário root.
Estando logado na máquina do banco, efetue logon no MySQL shell:
$mysql -u root -p
Forneça a senha de acesso e o prompt do shell MySQL será apresentado:
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 996333 Server version: 5.0.77-log Source distribution Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql>
Depois de logado, devemos criar o usuário e definir a senha:
mysql>create user backup@localhost identified by 'seu_password';
Neste exemplo, foi criado o usuário ‘backup’ que pode acessar o MySQL somente da própria máquina do banco, utilizando a senha ‘seu_password’. Se tentarmos acessar o MySQL com este usuário de outra máquina, que não seja a própria maquina do banco, teremos acesso negado.
Agora devemos dar os privilégios para este usuário efetuar as rotinas de backup:
mysql>GRANT SELECT, RELOAD, SHOW DATABASES, LOCK TABLES ON *.* TO 'backup'@'localhost';
O usuário ‘backup’ deve possuir os privilégios SELECT, RELOAD, SHOW DATABASES e LOCK TABLES para conseguir efetuar os backups corretamente.
Alguns testes podem ser feitos para verificar se o usuário backup está ok.
Tente logar no MySQL Shell
$mysql -u root -p
Depois verifique as databases disponíveis
mysql> show databases;
Suponto que exista uma database chamada teste, com uma tabela tabela1, efetue um select nesta database:
mysql> use backup; select * from tabela1;
Se tudo correu bem até agora, podemos ir para o próximo passo. Caso contrário, volte e verifique os passos executados.
Criação do script de backup
Como o script já está todo comentado, não serão feitos comentários extras a respeito do mesmo.
O script será salvo no diretório /opt/scripts com o nome de backup_mysql.sh
#!/bin/bash ################################################################### # Nome : backup_mysql.sh # Script para Backup dos dados do MySQL # # Criação : 31/03/2017 - Adail Antonio # # Ultima modificação : 31/03/2017 - Adail Antonio # ################################################################### # Changelog ##### Variaveis declare DATA=`date +%Y%m%d_%H%M%S` declare DIR_BACKUP="/opt/backups/mysql/" # Define o diretório de backup declare SENHA="seu_password" declare USER="backup" DIR_DEST_BACKUP=$DIR_BACKUP$DATA ################################################################### ##### Rotinas secundarias mkdir -p $DIR_BACKUP/$DATA # Cria o diretório de backup diário echo "MYSQL" echo "Iniciando backup do banco de dados" ################################################################## # função que executa o backup executa_backup(){ echo "Inicio do backup $DATA" #Recebe os nomes dos bancos de dados na maquina destino BANCOS=$(mysql -u $USER -p$SENHA -e "show databases") #retira palavra database #BANCOS=${BANCOS:9:${#BANCOS}} declare CONT=0 #inicia o laço de execução dos backups for banco in $BANCOS do if [ $CONT -ne 0 ]; then # ignora o primeiro item do array, cujo conteudo é "databases" NOME="backup_my_"$banco"_"$DATA".sql" echo "Iniciando backup do banco de dados [$banco]" # comando que realmente executa o dump do banco de dados mysqldump --hex-blob --lock-all-tables -u $USER -p$SENHA --databases $banco > $DIR_DEST_BACKUP/$NOME # verifica que se o comando foi bem sucedido ou nao. if [ $? -eq 0 ]; then echo "Backup Banco de dados [$banco] completo" else echo "ERRO ao realizar o Backup do Banco de dados [$banco]" fi fi CONT=`expr $CONT + 1` done DATA=`date +%Y%m%d_%H%M%S` echo "Final do backup: $DATA" } executa_backup 2>> $DIR_BACKUP/$DATA/backup.log 1>> $DIR_BACKUP/$DATA/backup.log ###################################################################
É importante não esquecer de dar permissões de execução ao script:
$sudo chmod +x /opt/scripts/backup_mysql.sh
Agendamento das execuções (crontab)
Para que o processo de automatização seja concluído, precisamos configurar o crontab da máquina, para que ela execute o script no horário desejado.
Para editar o crontab do root, com o editor padrão do sistema:
$sudo crontab -e
Serão inseridas duas linhas, a primeira linha diz para o crontab executar o script /opt/scripts/backup_mysql.sh todos os dias da semana às 02 a.m.
00 02 * * * /opt/scripts/backup_mysql.sh
A segunda linha, diz respeito a retenção dos arquivos de backup na máquina. Neste caso serão mantidos os backups dos ultimos 31 dias.
0 23 * * * /usr/bin/find /opt/backups/mysql -type d -ctime +31 -exec rm -rf '{}' \;
Depois de salvo o arquivo de configuração do crontab, seu sistema já esta devidamente configurado para os backups mensais.

Muito bom, bem explicativo para quem não usa linux diretamente! Parabéns.
Obrigado, Carlos! Seja sempre bem vindo.
EXCELENTE! Não existe outra palavra para definir esse artigo. Força e honra!
Republicou isso em Fernando "Eagle" De Sousa.
Boa dia Aldair, excelente, porém está dando erro de permissão de acesso (2800) Executei flush privileges; , Lista as tabelas dos bancos sem probelmas, acesso o MariaDB, mais o scrip continua com esse erro.
Esquece cara. Esqueci de alterar o campo senha, acontece rsrsr, obrigado pela dica.
Olá, Marcos! Havia um erro no post, quando eu disse para dar grant a um usuario “teste” e não ao usuario “backup”
Refaça o passo-a-passo do post de novo e deve funcionar. Obrigado!
Obrigado! Excelente!
Olá, esse passo a passo funciona no servidor Debian?
Olá, Thales! Tem muitos anos que não uso Debian, só Fedora e CentOS, mas dei uma olhada no tutorial e acredito que deve funcionar sem nenhuma modificaçao.
Obrigado meu nobre…
Excelente, porém gostaria de saber se dá para adaptar mais uma função de limpar os backups mais antigos (por exemplo com mais de 6 meses)?