Se você tem uma banco de dados MySQL, muito provavelmente você já precisou ou vai precisar acessar um backup de seu banco. A melhor maneira de se prevenir é manter uma rotina diária (ou conforme sua necessidade) de backups, e exatamente isso que vamos aprender a fazer nesse artigo. Vamos aprender a criar rotinas de backups do MySQL no Windows e no Linux, nosso objetivo será criar um script que cria uma cópia de segurança do nosso banco em um arquivo zipado com marcação de data e uma rotina diaria para executar, nosso script também será capaz de deletar arquivos mais antigos que 7 dias.

O que é MySQL?

Não entrarei em muitos dados técnicos sobre a história do MySQL, você pode conferir nesse link, mas resumidamente o MySQL é um sistema de gerenciamento de banco de dados (SGBD), que utiliza a linguagem SQL – Linguagem de Consulta Estruturada, do inglês Structured Query Language. Atualmente é mantida pela Oracle Corporation e distribuida sob duas licenças: GPL e Licença comercial.

Criando Backups do MySQL Diariamente no Windows

Vamos aprender como criar um script completo no Windows, para isso você precisa ter previamente instalado o MySQL e ter os dados do usuário com capacidade de leitura no banco de dados a ser copiado e vamos utilizar o 7zip para compactar os nosso arquivos.

Primeiro vamos criar o arquivo que vai conter as nossas credenciais de acesso ao banco: config.cnf.

# Configuracoes de usuario
[mysqldump]
 user=root
 password=senha

E agora o arquivo que vai realizar todo o processo de backup.

#Set-ExecutionPolicy -ExecutionPolicy Bypass 
$mysqlpath = "C:\Program Files\MySQL\MySQL Server 5.5\bin"  # Caminho para a instalção do MySQL
$backuppath = "C:\backups\"  # Caminho para armazenar os backups
$7zippath = "C:\Program Files (x86)\7-Zip"  # Caminho para a instalação do 7zip
$config = "C:\config.cnf"  # Caminho para o arquivo com as credenciais
$database = "blog" # Nome do nosso banco de dados
$errorLog = "C:\error_dump.log"  # Caminho para o nosso arquivo de log
$days = 7 # Dias para manter os arquivos de backup
$date = Get-Date 
$timestamp = " " + $date.day + $date.month + $date.year + "_" + $date.hour + $date.minute 
$backupfile = $backuppath + $database + "_" + $timestamp +".sql" 
$backupzip = $backuppath + $database + "_" + $timestamp +".zip" 
 
# Inicia o processo de backup 
CD $mysqlpath 
.\mysqldump.exe --defaults-extra-file=$config --log-error=$errorLog  --result-file=$backupfile  --databases $database /c 

# Inicia o processo de compactacao com 7zip  
CD $7zippath 
.\7z.exe a -tzip $backupzip $backupfile 
 
# Deleta o arquivo bruto
Del $backupfile 

# Deleta arquivos antigos
CD $backuppath 
$oldbackups = gci *.zip* 
 
for($i=0; $i -lt $oldbackups.count; $i++){ 
    if ($oldbackups[$i].CreationTime -lt $date.AddDays(-$days)){ 
        $oldbackups[$i] | Remove-Item -Confirm:$false 
    } 
}
<p>O arquivo deve ser salvo com a extensão <code>.ps1</code> (PowerShell).</p>

Agendador de Tarefas – Criando o Agendamento

Para criar o agendamento no Windows você pode utilizar o Agendador de Tarefas.

Criando Backups do MySQL Diariamente no Linux

Vamos aprender agora como criar um script completo no Linux, para isso você precisa ter previamente instalado o MySQL e ter os dados do usuário com capacidade de leitura no banco de dados a ser copiado. Também vamos utilizar o bzip2 para compactar os nosso arquivos, caso você não queira usar essa funcionalidade, comente as linhas 28 e 29.

#!/bin/bash

DB_NAME='dbname' # Nome do banco de dados
DB_USER='dbuser' # Usuario do banco
DB_PASS='dbpass' # Senha do banco
DB_PARAM='--add-drop-table --add-locks --extended-insert --single-transaction -quick' # Parametros para o backup https://dev.mysql.com/doc/refman/8.0/en/mysqldump.html

MYSQLDUMP=/usr/bin/mysqldump # Caminho para o binário do mysqldump
BACKUP_DIR=/backup/mysql # Caminho para salvar os backups
DIAS=7 # Quantos dias de backups deseja manter

DATE=`date +%Y-%m-%d`
BACKUP_NAME=mysql-$DATE.sql
BACKUP_TAR=mysql-$DATE.tar
BACKUP_BZ2=mysql-$DATE.tar.bz2

echo "Iniciando o processo de backup..."

#Gerando arquivo sql
echo "Gerando backup da base de dados $DB_NAME em $BACKUP_DIR/$BACKUP_NAME"
$MYSQLDUMP $DB_NAME $DB_PARAM -u $DB_USER -p$DB_PASS > $BACKUP_DIR/$BACKUP_NAME

# Compactando arquivo em tar
echo "Consolidando arquivo em tar ..."
tar -cf $BACKUP_DIR/$BACKUP_TAR -C $BACKUP_DIR $BACKUP_NAME

# Compactando arquivo com bzip2
echo "  -- Compactando arquivo em bzip2 ..."
bzip2 $BACKUP_DIR/$BACKUP_BZ2

# Excluindo arquivos brutos
echo "  -- Excluindo arquivos desnecessarios ..."
rm -rf $BACKUP_DIR/$BACKUP_NAME

# Excluindo arquivos mais antigos
find /backup/mysql -name "*.tar.bz2" -type f -mtime +$DIAS -exec rm -f {} \;

Salve o arquivo como mysql_backup.sh; De a ele permissão de execução com o comando chmod +x mysql_backup.sh; Agora execute o seu arquivo de backup com ./mysql_backup.sh.

Crontab – Criando o Agendamento

Para criar a rotina que execute diariamente o nosso backup no Linux, vamos usar a Crontab.

Abra a sua Crontab:

$ crontab -e

Agora vamos criar um agendamento que rode todos os dias às 00hs, para isso adicione a seguinte linha no final do arquivo:

0 0 * * *  sh ~/mysql_backup.sh
5 6 votos
Nota do Artigo
Subscribe
Notify of

11 Comentários
newest
oldest most voted
Inline Feedbacks
View all comments
Paulo
1 ano atrás

Olá Henrique!
Onde tem que salvar o arquivo “mysql_backup.sh”? É no public_html?

Lucas
3 anos atrás

Como salvar mais de um banco? separo por vírgula? ou crio um script para cada banco?

Alexandre Rodrigues dos Santos
3 anos atrás

como salvar todos os bancos?

Edson
3 anos atrás

Olá. Meu arquivo de backup está vindo vazio, 0kb. O que pode estar ocorrendo?

ROBSON PEREIRA DA SILVA
4 anos atrás

Boa noite, bem interessante o script. Gostaria de saber como executa e qual a extensão do script para Windows ?

Christian
Reply to  ROBSON PEREIRA DA SILVA
3 anos atrás

O tutorial pecou nisso, não falar a extensão do arquivo windows, mas crio eu que seja .ps1, PowerShell.

Rafael
Reply to  Christian
3 anos atrás

Talvez em .bat pra Windows

Christian
Reply to  Rafael
3 anos atrás

eu fiz outro em .bat, mas esse do tutorial eu fiz com o PowerShell e funcionou.

wpDiscuz
11
0
Would love your thoughts, please comment.x