Poupe até 53% em Servidores VPS, escolha agora. Oferta limitada.

Automatize Backup MySQL/MariaDB no Linux com Cron

13 min de leitura  ·  Guia técnico

Para automatizar o backup do MySQL ou MariaDB no Linux com cron, crie scripts de backup, configure cron jobs para execução automática e implemente notificações de falhas. Este processo garante que os backups sejam realizados regularmente sem intervenção manual.

  1. Instalar e configurar o mysqldump no servidor
  2. Criar script de backup com compressão e rotação
  3. Configurar cron job para execução automática
  4. Implementar notificações de status por email
  5. Testar restauração e validar integridade dos backups
  6. Configurar armazenamento remoto para redundância

Pré-requisitos

  • Acesso root ou sudo ao servidor Linux
  • MySQL ou MariaDB instalado e funcionando
  • Usuário MySQL com privilégios de backup (SELECT, LOCK TABLES, SHOW VIEW)
  • Espaço em disco suficiente para armazenar backups
  • Cliente de email configurado para notificações (opcional)
  • Conhecimento básico de comandos Linux e cron

Preparando o ambiente para backup automatizado do MySQL

Antes de automatizar o backup MySQL, é essencial preparar o ambiente adequadamente. Primeiro, crie um usuário dedicado para backups com privilégios mínimos necessários.

mysql -u root -p
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY 'senha_forte_aqui';
GRANT SELECT, LOCK TABLES, SHOW VIEW, EVENT, TRIGGER ON *.* TO 'backup_user'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Em seguida, crie a estrutura de diretórios para organizar os backups:

mkdir -p /backup/mysql/{daily,weekly,monthly}
mkdir -p /backup/logs
chown -R backup_user:backup_user /backup
chmod 750 /backup

Configure um arquivo de credenciais para evitar expor senhas nos scripts:

cat > /home/backup_user/.my.cnf << 'EOF'
[mysqldump]
user=backup_user
password=senha_forte_aqui
single-transaction=true
routines=true
triggers=true
EOF

chmod 600 /home/backup_user/.my.cnf
chown backup_user:backup_user /home/backup_user/.my.cnf

Criando script de backup completo com rotação

O script de backup deve incluir compressão, rotação automática e logging detalhado. Crie o script principal que será executado pelo cron:

cat > /usr/local/bin/mysql_backup.sh << 'EOF'
#!/bin/bash

# Configurações
BACKUP_DIR="/backup/mysql"
LOG_FILE="/backup/logs/mysql_backup.log"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="backup_user"

# Função de log
log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# Início do backup
log_message "Iniciando backup automático do MySQL"

# Lista todos os bancos exceto system databases
DATABASES=$(mysql -u $MYSQL_USER -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")

for db in $DATABASES; do
    log_message "Fazendo backup do banco: $db"
    
    # Backup com compressão
    mysqldump -u $MYSQL_USER --single-transaction --routines --triggers $db | gzip > $BACKUP_DIR/daily/${db}_${DATE}.sql.gz
    
    if [ $? -eq 0 ]; then
        log_message "Backup do $db concluído com sucesso"
    else
        log_message "ERRO: Falha no backup do $db"
        echo "Falha no backup do banco $db em $(date)" | mail -s "Erro no Backup MySQL" [email protected]
    fi
done

# Limpeza de backups antigos
find $BACKUP_DIR/daily -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
log_message "Limpeza de backups antigos concluída"

# Verificação de espaço em disco
DISK_USAGE=$(df $BACKUP_DIR | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 85 ]; then
    log_message "AVISO: Uso de disco alto ($DISK_USAGE%)"
    echo "Uso de disco do backup em $DISK_USAGE%" | mail -s "Aviso: Espaço em Disco" [email protected]
fi

log_message "Backup automático finalizado"
EOF

chmod +x /usr/local/bin/mysql_backup.sh
chown backup_user:backup_user /usr/local/bin/mysql_backup.sh

Teste o script manualmente antes de automatizar:

sudo -u backup_user /usr/local/bin/mysql_backup.sh

Output esperado no log:

2024-01-15 02:00:01 - Iniciando backup automático do MySQL
2024-01-15 02:00:02 - Fazendo backup do banco: wordpress
2024-01-15 02:00:15 - Backup do wordpress concluído com sucesso
2024-01-15 02:00:16 - Limpeza de backups antigos concluída
2024-01-15 02:00:17 - Backup automático finalizado

Configurando cron job para execução automática

A configuração do cron job determina quando e com que frequência os backups serão executados. Para backups diários às 2h da manhã, edite o crontab do usuário backup:

sudo -u backup_user crontab -e

Adicione as seguintes linhas para diferentes tipos de backup:

# Backup diário às 2h da manhã
0 2 * * * /usr/local/bin/mysql_backup.sh >/dev/null 2>&1

# Backup semanal aos domingos às 3h (com retenção de 30 dias)
0 3 * * 0 /usr/local/bin/mysql_backup_weekly.sh >/dev/null 2>&1

# Verificação de integridade às 4h
0 4 * * * /usr/local/bin/verify_backup.sh >/dev/null 2>&1

Para ambientes de alta criticidade, configure backup incremental a cada 6 horas:

# Backup incremental a cada 6 horas
0 */6 * * * /usr/local/bin/mysql_incremental_backup.sh >/dev/null 2>&1

Verifique se o cron job foi configurado corretamente:

sudo -u backup_user crontab -l

Para monitorar a execução do cron, verifique os logs do sistema:

tail -f /var/log/cron | grep mysql_backup

Implementando verificação de integridade e notificações

Crie um script para verificar a integridade dos backups e enviar notificações sobre o status:

cat > /usr/local/bin/verify_backup.sh << 'EOF'
#!/bin/bash

BACKUP_DIR="/backup/mysql/daily"
LOG_FILE="/backup/logs/backup_verification.log"
ADMIN_EMAIL="[email protected]"

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

# Verifica backups do dia anterior
YESTERDAY=$(date -d "yesterday" +%Y%m%d)
BACKUP_COUNT=$(find $BACKUP_DIR -name "*${YESTERDAY}*.sql.gz" | wc -l)

log_message "Verificando backups de $YESTERDAY"

if [ $BACKUP_COUNT -eq 0 ]; then
    log_message "ERRO: Nenhum backup encontrado para $YESTERDAY"
    echo "Nenhum backup MySQL encontrado para $YESTERDAY" | mail -s "ERRO: Backup MySQL Ausente" $ADMIN_EMAIL
    exit 1
fi

# Testa integridade dos arquivos
for backup_file in $(find $BACKUP_DIR -name "*${YESTERDAY}*.sql.gz"); do
    if ! gzip -t "$backup_file" 2>/dev/null; then
        log_message "ERRO: Arquivo corrompido: $backup_file"
        echo "Backup corrompido detectado: $backup_file" | mail -s "ERRO: Backup MySQL Corrompido" $ADMIN_EMAIL
    else
        log_message "Backup íntegro: $(basename $backup_file)"
    fi
done

# Relatório de status
TOTAL_SIZE=$(du -sh $BACKUP_DIR | cut -f1)
log_message "Verificação concluída. Tamanho total dos backups: $TOTAL_SIZE"

# Envia relatório semanal (apenas às segundas-feiras)
if [ $(date +%u) -eq 1 ]; then
    echo "Relatório semanal de backup MySQL:
    
Backups verificados: $BACKUP_COUNT
Tamanho total: $TOTAL_SIZE
Status: OK

Últimas 5 entradas do log:
$(tail -5 $LOG_FILE)" | mail -s "Relatório Semanal - Backup MySQL" $ADMIN_EMAIL
fi
EOF

chmod +x /usr/local/bin/verify_backup.sh
chown backup_user:backup_user /usr/local/bin/verify_backup.sh

Configurando armazenamento remoto e sincronização

Para maior segurança, configure sincronização automática dos backups para armazenamento remoto. Primeiro, instale e configure o rsync para transferência segura:

apt update && apt install rsync -y

Configure chaves SSH para autenticação sem senha:

sudo -u backup_user ssh-keygen -t rsa -b 4096 -f /home/backup_user/.ssh/backup_key -N ""
sudo -u backup_user ssh-copy-id -i /home/backup_user/.ssh/backup_key.pub [email protected]

Crie script para sincronização remota:

cat > /usr/local/bin/sync_remote_backup.sh << 'EOF'
#!/bin/bash

LOCAL_BACKUP="/backup/mysql"
REMOTE_USER="backup"
REMOTE_HOST="backup-server.com"
REMOTE_PATH="/backup/mysql-backups/$(hostname)"
SSH_KEY="/home/backup_user/.ssh/backup_key"
LOG_FILE="/backup/logs/remote_sync.log"

log_message() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}

log_message "Iniciando sincronização remota"

# Sincroniza apenas backups dos últimos 7 dias
rsync -avz --delete --ssh="ssh -i $SSH_KEY" \
    --include="*/" \
    --include="*.sql.gz" \
    --exclude="*" \
    --newer-than="7 days ago" \
    $LOCAL_BACKUP/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_PATH/

if [ $? -eq 0 ]; then
    log_message "Sincronização remota concluída com sucesso"
else
    log_message "ERRO: Falha na sincronização remota"
    echo "Falha na sincronização de backup remoto" | mail -s "Erro: Sync Backup" [email protected]
fi
EOF

chmod +x /usr/local/bin/sync_remote_backup.sh
chown backup_user:backup_user /usr/local/bin/sync_remote_backup.sh

Adicione a sincronização ao crontab para execução após o backup:

sudo -u backup_user crontab -e

Adicione a linha:

# Sincronização remota 30 minutos após o backup
30 2 * * * /usr/local/bin/sync_remote_backup.sh >/dev/null 2>&1

Problemas comuns e como resolver

Erro: "Access denied for user 'backup_user'@'localhost'"

Causa: Privilégios insuficientes ou credenciais incorretas no arquivo .my.cnf.
Solução: Verifique as permissões do usuário com SHOW GRANTS FOR 'backup_user'@'localhost'; e confirme se a senha no arquivo .my.cnf está correta. Reaplique os privilégios se necessário.

Backup falha com erro "Table is marked as crashed"

Causa: Tabelas corrompidas no banco de dados que impedem o backup completo.
Solução: Execute mysqlcheck --auto-repair --all-databases para reparar tabelas corrompidas antes do backup. Considere usar --single-transaction para backups consistentes.

Cron job não executa ou falha silenciosamente

Causa: Variáveis de ambiente ausentes, permissões incorretas ou PATH não configurado no crontab.
Solução: Adicione PATH=/usr/local/bin:/usr/bin:/bin no início do crontab e verifique se o usuário backup_user tem permissões de execução nos scripts. Teste o script manualmente primeiro.

Espaço em disco insuficiente durante backup

Causa: Acúmulo de backups antigos ou crescimento inesperado do banco de dados.
Solução: Implemente rotação automática mais agressiva, use compressão adicional com gzip -9, ou configure limpeza baseada em tamanho total em vez de apenas idade dos arquivos.

Notificações por email não funcionam

Causa: Serviço de email não configurado ou bloqueado por firewall.
Solução: Instale e configure postfix com apt install postfix mailutils, ou use SMTP externo. Teste com echo "teste" | mail -s "Teste" [email protected] antes de implementar nos scripts.

Perguntas frequentes sobre backup automatizado do MySQL

Com que frequência devo automatizar backups do MySQL?

Para bancos de produção, recomenda-se backup diário completo e backup incremental a cada 6 horas. Sites de baixo movimento podem usar backup diário apenas. A frequência depende da criticidade dos dados e do volume de alterações.

O cron job de backup MySQL pode afetar a performance do servidor?

Sim, backups grandes podem consumir CPU e I/O durante a execução. Para minimizar o impacto, agende backups em horários de menor tráfego e use nice/ionice para reduzir prioridade do processo. Considere backup incremental para bancos muito grandes.

Como verificar se o backup automatizado do MySQL está funcionando?

Verifique os logs do cron em /var/log/cron, confirme a criação dos arquivos de backup no diretório especificado e teste a restauração periodicamente. Configure notificações por email para falhas e monitore o tamanho dos arquivos gerados.

É seguro armazenar backups MySQL no mesmo servidor?

Não é recomendado manter backups apenas no mesmo servidor dos dados originais. Use armazenamento remoto como FTP, SFTP, ou cloud storage. Mantenha pelo menos uma cópia em local diferente para proteção contra falhas de hardware ou ataques.

Qual comando usar para backup completo do MySQL via cron?

Use mysqldump com opções --single-transaction --routines --triggers para backup completo. Exemplo: mysqldump -u usuario -p'senha' --single-transaction --routines --triggers nome_banco > backup_$(date +%Y%m%d_%H%M%S).sql. Sempre teste o comando manualmente antes de automatizar.

Conclusão

  • Implemente monitoramento contínuo dos backups com verificação de integridade e notificações automáticas para garantir confiabilidade
  • Configure armazenamento remoto redundante para proteger contra falhas de hardware e desastres no servidor principal
  • Teste regularmente a restauração dos backups em ambiente isolado para validar a eficácia do processo de recuperação

Leia também

Precisa de ajuda com backup automatizado do MySQL?

Nossa equipe especializada pode configurar sistemas robustos de backup automatizado para seus bancos de dados MySQL. Oferecemos implementação completa com monitoramento, redundância e testes de restauração.

Conheça nossos serviços de VPS Linux

  • 0 Os usuários acharam isso útil
  • mysql, backup, cron, linux, automacao, avirahost
Esta resposta foi útil?

Artigos Relacionados

Guia Completo: Como escolher o melhor plano de hospedagem para o seu site

Escolher o plano de hospedagem ideal para o seu site é fundamental para garantir seu bom...

Lista Prática: 5 Vantagens de ter SSL gratuito no seu site

Ter um certificado SSL no seu site não é apenas uma questão de segurança, mas também uma...

Comparativo: Hospedagem de sites vs. VPS: qual é a melhor opção?

Quando se trata de escolher entre hospedagem compartilhada ou VPS, as opções variam de acordo...

Dicas de Otimização de Servidores Linux

Dicas de Otimização de Servidores Linux Servidores Linux são amplamente utilizados por sua...

Como Implementar Soluções Eficientes para Melhorar a Gestão de Serviços Online

Como Implementar Soluções Eficientes para Melhorar a Gestão de Serviços Online...