Script de backup de banco de dados Mysql

Por Aristides Neto - 10/06/2019

dicas mysql

Fala pessoal tudo beleza?

Nesse artigo vou mostrar um script bem bacana para fazer backup de banco de dados Mysql.

O script irá gerar um arquivo de log para futuras consultas e também terá a opção de remover os backups antigos. Uma dica interessante é utilizar notificações para que quando ocorrer algum erro seja enviado um email ou uma notificação.

Bora então ver esse script?

Irei colocar trechos do código do script separadamente e com explicações. No final deixarei o script completo para vocês, ok?

Aqui iremos definir o caminho de onde serão salvos os arquivos de logs.

# Caminho do arquivo de log
LOG_DIR=/var/log/backup
LOG=$LOG_DIR/backup_db_$ANO$MES$DIA.log

Nesse trecho definimos o diretório que os backups serão salvos.

# Diretorio onde serão salvos os backups
DIR_BK=/var/backups/database

Para evitar erros durante o processo, antes de salvarmos os arquivos de log e backup iremos verificar se o diretório existe, caso não, iremos criar.

# Verifica se existe o diretorio para armazenar os logs
if [ ! -d $LOG ]; then
    mkdir $LOG
fi

# Verifica se existe o diretorio para o backup
if [ ! -d $DIR_BK ]; then
    mkdir -p $DIR_BK
fi

Aqui vai uma dica bastante útil, você pode definir os bancos de dados que serão backupeados durante o processo. Para isso informe o nome dos bancos separados por espaços.

# Lista dos bancos de dados que serão realizados o backup
DATABASES=(banco01 banco02 banco03)

Agora nesse trecho, iremos fazer um loop percorrendo a lista de bancos que foram informados na linha acima. Após o término do backup iremos compactar o arquivo sql em bz2.

# Loop para backupear todos os bancos
for db in "${DATABASES[@]}"; do
    # Mysql DUMP
    mysqldump -u$USER -p$PASS $db > $DIR_BK/$db'_'$DATA_ATUAL.sql

    # Compacta o arquivo sql em BZ2
    bzip2 $DIR_BK/$db'_'$DATA_ATUAL.sql
done

Nessa linha, informamos que os backups com mais de 5 dias serão removidos, assim economizando espaço. Você pode alterar o número de dias conforme sua necessidade.

# Remove arquivos de backups antigos
find $DIR_BK -type f -mtime +5 -exec rm -rf {} \;

Bom, até aqui vimos alguns trechos do script de backup, que somente eles não fazem sentido.

Esse é um script simples, mas que pode ser melhorado e já resolve e muito nas rotinas de backups.

Veja abaixo o script completo.

#!/bin/bash
# 
# Autor: Aristides Neto
# Email: [email protected]
#
# Data: 09/06/2019
#
# Realiza o backup de bancos de dados MySQL
#

# Define usuario e senha do banco
USER='root'
PASS='root'

# Datas
DIA=`date +%d`
MES=`date +%m`
ANO=`date +%Y`
DATA_ATUAL=`date +%Y-%m-%d-%H-%M`

# Data de Inicio do Backup
DATA_INICIO=`date +%d/%m/%Y-%H:%M:%S`

# Caminho do arquivo de log
LOG_DIR=/var/log/backup
LOG=$LOG_DIR/backup_db_$ANO$MES$DIA.log

# Diretorio onde serão salvos os backups
DIR_BK=/var/backups/database

# Lista dos bancos de dados que serão realizados o backup
DATABASES=(banco01 banco02)

# Verifica se existe o diretorio para armazenar os logs
if [ ! -d $LOG_DIR ]; then
    mkdir $LOG_DIR
fi

# Verifica se existe o diretorio para o backup
if [ ! -d $DIR_BK ]; then
    mkdir -p $DIR_BK
fi

# Inicio do backup
echo "MYSQLDUMP Iniciado em $DATA_INICIO" >> $LOG

# Loop para backupear todos os bancos
for db in "${DATABASES[@]}"; do
    # Mysql DUMP
    # Para backupear procedures e functions foi adicionado o --routines
    mysqldump --routines -u$USER -p$PASS $db > $DIR_BK/$db'_'$DATA_ATUAL.sql

    echo "Realizando backup do banco ...............[ $db ]" >> $LOG

    # Compacta o arquivo sql em BZ2
    bzip2 $DIR_BK/$db'_'$DATA_ATUAL.sql
done

DATA_FINAL=`date +%d/%m/%Y-%H:%M:%S`
echo "MYSQLDUMP Finalizado em $DATA_FINAL" >> $LOG

# Remove arquivos de backups antigos - 5 dias
find $DIR_BK -type f -mtime +5 -exec rm -rf {} \;

Lembre-se, sempre faça backup e restore dos seus backups... Tenha certeza que quando for precisar restaurar um banco, você tenha um backup confiável!

O que achou desse script? Se tiver alguma dúvida deixa um comentário que faço questão em ajudar!

Até a próxima!

Aristides Neto

Programador web focado no back-end, mas esforçado no front. Entusiasta em gerenciamento de servidores Linux, impressionado com a automatização de processos e provisionamento de máquinas.