MySQL: O Guia Completo para Backup e Recuperação do MySQL

Última atualização: 2026-08-26

O disco rígido do servidor da empresa de Alice apresentou uma falha repentina, causando a perda total do banco de dados. Sem backups, três anos de dados de clientes, registros de pedidos e informações financeiras foram perdidos para sempre. Esse desastre serviu como um alerta para ela, levando-a a estabelecer um sistema de backup abrangente: backups diários completos com mysqldump, backups incrementais contínuos do binlog, transferências semanais de dados para um local externo e simulados de recuperação mensais. Desde então, mesmo que ela enfrente outra falha de hardware, ela consegue restaurar totalmente todos os dados em 30 minutos.

Nesta aula, você aprenderá:

100%
flowchart TD
    A[Daily Full Backup<br/>mysqldump --single-transaction] --> B[binlog Ongoing Record<br/>Real-Time Incremental]
    B --> C[Weekly Remote Data Transfer<br/>rsync/scp To Remote]
    C --> D[Monthly Recovery Drills<br/>Verify Backup Availability]
    D -->|Drill Passed| A
    D -->|Identifying Problems| E[Adjust the Backup Strategy]
    E --> A

1. História: O preço de não ter um backup

A TechFlow, empresa onde Alice trabalha, opera um banco de dados MySQL para sua plataforma de comércio eletrônico, que armazena três anos de pedidos de clientes e informações de contas. A equipe de operações nunca havia estabelecido um processo formal de backup, contando exclusivamente com um array RAID como “rede de segurança”. Numa sexta-feira à noite, uma falha no sistema de ar-condicionado do data center causou o superaquecimento dos servidores, resultando na falha simultânea de dois discos rígidos e no colapso do array RAID. Todos os dados — informações de clientes, registros de transações e dados de estoque — foram perdidos. A empresa passou três meses tentando recuperar os dados, mas conseguiu recuperar menos de 10% deles. O prejuízo financeiro direto ultrapassou 500.000 dólares, e a empresa também perdeu grande parte da confiança dos clientes.

Após essa lição dolorosa, Alice assumiu a liderança na implantação de um sistema abrangente de backup: backups completos automáticos todos os dias à meia-noite, backups incrementais em tempo real por meio do binlog, sincronização semanal em local externo e simulados de recuperação mensais. Seis meses depois, o servidor apresentou falha novamente, mas, dessa vez, ela concluiu uma recuperação completa em 30 minutos, praticamente sem interrupção nos negócios.


2. Backups lógicos e backups físicos

(1) Visão geral dos backups lógicos

Um backup lógico exporta os dados de um banco de dados para um arquivo de texto SQL contendo instruções como CREATE TABLE e INSERT. Para restaurar os dados, basta reexecutar essas instruções SQL. Uma ferramenta representativa é o mysqldump.

Vantagens: Alta legibilidade, compatibilidade entre versões e a capacidade de fazer backup seletivo de bancos de dados e tabelas individuais.

Desvantagens: Baixa velocidade; tanto o backup quanto a restauração exigem a participação do processo do MySQL; demorado para bancos de dados grandes.

(2) Visão geral dos backups físicos

Um backup físico copia diretamente os arquivos de dados subjacentes do banco de dados (.ibd, .frm, etc.); para restaurar, basta copiar os arquivos de volta para o diretório de dados. Uma ferramenta representativa é o XtraBackup.

Vantagens: Rápido, sem bloqueio de tabelas (InnoDB), adequado para grandes bancos de dados.

Desvantagens: Não é legível por humanos, tem compatibilidade limitada entre plataformas e exige tempo de inatividade ou o uso de ferramentas especializadas para manter a consistência.

Item de comparação Backup lógico (mysqldump) Backup físico (XtraBackup)
Conteúdo de backup Instruções SQL Cópias de arquivos de dados
Velocidade do backup Lenta (exportação linha por linha) Rápida (cópia de arquivo)
Velocidade de recuperação Lenta (executa o SQL linha por linha) Rápida (copia os arquivos de volta)
Impacto do bloqueio de tabelas InnoDB sem bloqueios Sem bloqueios de tabelas
Legibilidade Alta (SQL em texto simples) Baixa (arquivo binário)
Sobrecarga de armazenamento Baixa (alta taxa de compressão de texto) Alta (cópia completa do arquivo)
Entre versões Compatível Requer correspondência de versão
Casos de uso Bancos de dados de pequeno a médio porte ≤ 50 GB Bancos de dados grandes > 50 GB

3. Uma explicação detalhada sobre os backups lógicos do mysqldump

(1) Backup completo

Um backup completo exporta todos os dados de todos os bancos de dados; é o método de backup mais básico e seguro.

BASH
mysqldump -u root -p --all-databases --single-transaction > full_backup.sql

O parâmetro --single-transaction utiliza instantâneos de consistência para leituras em tabelas InnoDB e não bloqueia a tabela. As tabelas MyISAM continuam bloqueadas.

(2) Backups de um único banco de dados e de uma única tabela

BASH
# Backing Up a Single Database
mysqldump -u root -p --single-transaction mydb > mydb_backup.sql

# Back up the specified table
mysqldump -u root -p --single-transaction mydb users orders > tables_backup.sql

(3) Separação entre estrutura e dados

BASH
# Back up only the table structure
mysqldump -u root -p --no-data mydb > mydb_schema.sql

# Back up only the data
mysqldump -u root -p --no-create-info mydb > mydb_data.sql

▶ Exemplo: Cinco modos de backup do mysqldump

BASH
# Pattern1:Full Backup(All Libraries)
mysqldump -u root -p --all-databases \
  --single-transaction --routines --triggers \
  > full_backup_$(date +%Y%m%d).sql

# Pattern2:Single-Database Backup
mysqldump -u root -p --single-transaction mydb > mydb.sql

# Pattern3:Single-Table Backup
mysqldump -u root -p --single-transaction mydb users > users.sql

# Pattern4:Structure Only
mysqldump -u root -p --no-data mydb > schema.sql

# Pattern5:Data Only
mysqldump -u root -p --no-create-info mydb > data.sql
Parâmetro Função Caso de uso
--all-databases Fazer backup de todos os bancos de dados Backup completo
--single-transaction Instantâneo de consistência do InnoDB Backup online sem bloqueios de tabela
--no-data Exportar apenas as estruturas das tabelas Documentação, scripts de criação de banco de dados
--no-create-info Apenas exportação de dados Migração de dados
--routines Inclui procedimentos armazenados e funções Backup lógico completo
--triggers Inclui gatilhos Backup completo da lógica
--where="condition" Exportar linhas selecionadas com base em critérios Migração parcial de dados
--quick Ler linha por linha sem armazenamento em cache Evitar OOM durante backups de tabelas grandes

4. Restaurar o banco de dados

(1) Recuperação de comandos do MySQL

Restaurar dados de um arquivo de backup do SQL para um banco de dados especificado:

BASH
mysql -u root -p mydb < mydb_backup.sql

Restaurar um arquivo de backup compactado:

BASH
gunzip < mydb_backup.sql.gz | mysql -u root -p mydb

(2) Restauração com o comando SOURCE

Faça a restauração usando o comando SOURCE no cliente do MySQL:

SQL
USE mydb;
SOURCE /var/backups/mysql/mydb_backup.sql;

▶ Exemplo: Processo de recuperação

BASH
# Steps1:Create the target database
mysql -u root -p -e "CREATE DATABASE mydb_restore;"

# Steps2:Restore Data
mysql -u root -p mydb_restore < mydb_backup.sql

# Steps3:Number of rows to verify
mysql -u root -p -e "SELECT COUNT(*) FROM mydb_restore.users;"

▶ Exemplo: Restaurando um backup compactado

BASH
# Restore gzip Compressed Backup
gunzip < /backup/mydb_20260703.sql.gz | mysql -u root -p mydb

# Restore and display progress
pv /backup/mydb_20260703.sql.gz | gunzip | mysql -u root -p mydb

5. Exportação e importação de dados

(1) SELECT INTO OUTFILE

Exporte os resultados da consulta para um arquivo CSV no servidor:

SQL
SELECT id, name, email
FROM users
WHERE status = 'active'
INTO OUTFILE '/tmp/active_users.csv'
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Observação: O caminho para INTO OUTFILE é o caminho no servidor MySQL, e não o caminho do cliente. O processo do MySQL deve ter permissões de gravação para esse caminho, e a variável secure_file_priv deve permitir o acesso a esse diretório.

(2) LOAD DATA INFILE

Importar dados de um arquivo CSV do lado do servidor para uma tabela:

SQL
LOAD DATA INFILE '/tmp/active_users.csv'
INTO TABLE users_copy
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;

▶ Exemplo: O processo completo para exportar e importar arquivos CSV

SQL
-- Export order data as CSV
SELECT order_id, customer_id, total_amount, order_date
FROM orders
WHERE order_date >= '2026-01-01'
INTO OUTFILE '/tmp/orders_2026.csv'
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';

-- Import into another table
LOAD DATA INFILE '/tmp/orders_2026.csv'
INTO TABLE orders_archive
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n';
▶ Experimente

▶ Exemplo: Importação de arquivos de clientes usando LOCAL

SQL
LOAD DATA LOCAL INFILE '/home/alice/data/products.csv'
INTO TABLE products
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n'
IGNORE 1 ROWS;
▶ Experimente

6. Registros binários e recuperação em um ponto no tempo

(1) Noções básicas sobre o binlog

O log binário registra todas as instruções SQL que modificam dados e é utilizado principalmente para replicação mestre-escravo e recuperação em um ponto no tempo (PITR).

SQL
-- View binlog Enabled or Disabled
SHOW VARIABLES LIKE 'log_bin%';

-- View Current binlog List of Files
SHOW BINARY LOGS;

-- View the data currently being written binlog
SHOW MASTER STATUS;

-- View binlog Details of the Incident
SHOW BINLOG EVENTS IN 'binlog.000003';

Três formatos de binlog:

Formato Conteúdo do registro Prós e contras
INSTRUÇÃO Registra instruções SQL O tamanho do log é pequeno, mas pode haver inconsistências nas instruções
ROW Alterações no nível da linha Log extenso, mas boa consistência dos dados
MISTURADO Modo misto Use STATEMENT por padrão; mude para ROW em caso de dúvida

(2) Processo de recuperação em um ponto no tempo

A abordagem principal para a recuperação em um momento específico: Primeiro, restaurar o backup completo mais recente; em seguida, reproduzir o binlog até o momento alvo.

BASH
# Steps1:Restore a Full Backup
mysql -u root -p mydb < full_backup_20260703.sql

# Steps2:Find the point in time before the error occurred
mysqlbinlog --base64-output=DECODE-ROWS -v binlog.000003 | grep -A5 "DROP TABLE"

# Steps3:Replay binlog By the target date
mysqlbinlog --start-datetime="2026-07-03 02:00:00" \
  --stop-datetime="2026-07-03 14:30:00" \
  binlog.000003 binlog.000004 | mysql -u root -p

▶ Exemplo: Recuperação em um ponto específico no tempo após a exclusão acidental de uma tabela

TEXT 📖 Somente leitura
Scene: At 14:25, accidentally executed DROP TABLE orders, need to revert to 14:24:59 state

Timeline:
  02:00  Full backup completed
  ...
  14:24  Last normal operation
  14:25  DROP TABLE orders (operational error)
  14:30  Problem identified, start recovery

Recovery steps:
  1. Restore 02:00 full backup
  2. Use mysqlbinlog to replay binlog from 02:00 to 14:24:59
  3. Verify orders table data integrity
BASH
# Execute the command
mysql -u root -p mydb < /backup/full_20260703.sql

mysqlbinlog --start-datetime="2026-07-03 02:00:00" \
  --stop-datetime="2026-07-03 14:24:59" \
  /var/lib/mysql/binlog.000003 \
  /var/lib/mysql/binlog.000004 \
  | mysql -u root -p mydb

7. Backup físico com o XtraBackup

(1) Como funciona o XtraBackup

O XtraBackup é uma ferramenta de backup físico de código aberto desenvolvida pela Percona. Seu princípio fundamental é:

  1. Thread em segundo plano Lê continuamente as páginas de dados do InnoDB enquanto monitora as alterações no log de refazer
  2. Os novos logs de refazer gerados durante o backup também são registrados continuamente.
  3. Após a conclusão do backup, use o log de refazer para atualizar as páginas de dados até um estado consistente.
  4. Não há bloqueio de tabelas durante todo o processo; as operações de leitura e gravação de dados não são afetadas.

(2) Operações básicas

BASH
# Full Backup
xtrabackup --backup --target-dir=/backup/full -u root -p

# Preparing to Back Up(Applications redo log,Ensure data consistency)
xtrabackup --prepare --target-dir=/backup/full

# Restore Backup
xtrabackup --copy-back --target-dir=/backup/full

# Incremental Backup(Based on the full dataset)
xtrabackup --backup --target-dir=/backup/inc1 \
  --incremental-basedir=/backup/full -u root -p

# Preparing an Incremental Backup
xtrabackup --prepare --apply-log-only --target-dir=/backup/full
xtrabackup --prepare --target-dir=/backup/full \
  --incremental-dir=/backup/inc1

▶ Exemplo: Backup completo e restauração com o XtraBackup

BASH
# Full Backup
xtrabackup --backup \
  --target-dir=/data/backup/full_20260703 \
  --user=root --password=Secret123

# Preparation Phase
xtrabackup --prepare \
  --target-dir=/data/backup/full_20260703

# Stop before restoring MySQL
systemctl stop mysqld

# Clear the Data Directory and Restore
rm -rf /var/lib/mysql/*
xtrabackup --copy-back \
  --target-dir=/data/backup/full_20260703

# Repair permissions and start
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld

8. Elaboração de uma estratégia de backup

(1) Combinação completa e incremental

(2) Backup externo

Os arquivos de backup devem ser transferidos para um local de armazenamento externo a fim de evitar desastres no centro de dados:

BASH
# Usage rsync Transmit to a remote location
rsync -avz /backup/mysql/ backup-server:/data/mysql_backup/

# Usage scp Transmission
scp /backup/mysql/full_20260703.sql.gz backup-server:/data/backup/

(3) Simulados regulares de recuperação em caso de desastre

Um backup que não é verificado não é um backup de verdade. Realize um teste completo de recuperação pelo menos uma vez por mês para verificar o seguinte:

Volume de dados Frequência do backup completo Método incremental Estratégia de armazenamento externo Simulados de recuperação
≤ 10 GB Backup completo diário binlog Transferência diária Uma vez por mês
10–100 GB Backup diário completo binlog Transferência diária Uma vez por mês
100 GB – 1 TB Backup completo semanal Backup incremental diário com o XtraBackup Transferência semanal Trimestral
> 1 TB Backup completo semanal Backup incremental diário com o XtraBackup Sincronização em tempo real Trimestral
Método de recuperação Cenários aplicáveis Velocidade de recuperação Complexidade Granularidade dos dados
Restauração completa do mysqldump Exclusão acidental do banco de dados/migração completa do banco de dados Lenta Baixa Banco de dados completo
Recuperação em um momento específico do Binlog Revertimento devido a erro do usuário Média Alta Menos de um segundo
Restauração do XtraBackup Falha de hardware/desastre Rápida Média Banco de dados completo
LOAD DATA INFILE Atualização de dados de uma única tabela Rápido Baixo Tabela única

9. Backups automatizados e exemplos detalhados

(1) Pontos-chave para backups automatizados

▶ Exemplo: Script de backup automatizado

BASH
#!/bin/bash
# mysql_backup.sh - MySQL Automated Backup Script
BACKUP_DIR="/data/backup/mysql"
RETAIN_DAYS=7
DB_USER="root"
DB_PASS="Secret123"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"

mkdir -p $BACKUP_DIR
echo "[$DATE] Start Backup..." >> $LOG_FILE

mysqldump -u$DB_USER -p$DB_PASS \
  --all-databases --single-transaction \
  --routines --triggers --set-gtid-purged=OFF \
  | gzip > $BACKUP_DIR/full_${DATE}.sql.gz

if [ $? -eq 0 ]; then
  SIZE=$(du -sh $BACKUP_DIR/full_${DATE}.sql.gz | cut -f1)
  echo "[$DATE] Backup Successful,Size: $SIZE" >> $LOG_FILE
else
  echo "[$DATE] Backup Failed!" >> $LOG_FILE
  exit 1
fi

find $BACKUP_DIR -name "full_*.sql.gz" -mtime +$RETAIN_DAYS -delete
echo "[$DATE] Cleanup ${RETAIN_DAYS} Backup from X days ago" >> $LOG_FILE

▶ Exemplo: Script completo de backup e restauração

BASH
#!/bin/bash
# full_backup_restore.sh - Complete Backup and Recovery Verification Script
BACKUP_DIR="/data/backup/mysql"
MYSQL_USER="root"
MYSQL_PASS="Secret123"
REMOTE_HOST="backup-server"
REMOTE_DIR="/data/mysql_backup"
DATE=$(date +%Y%m%d)
LOG="/var/log/backup_restore.log"

echo "=== $DATE Backup and Recovery Process ===" >> $LOG

# 1. Full Backup
mysqldump -u$MYSQL_USER -p$MYSQL_PASS \
  --all-databases --single-transaction \
  --routines --triggers \
  | gzip > $BACKUP_DIR/full_${DATE}.sql.gz
echo "[$DATE] Full backup completed" >> $LOG

# 2. Refresh and Record binlog Location
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "FLUSH BINARY LOGS;"
BINLOG_FILE=$(mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -N -e "SHOW MASTER STATUS;" | awk '{print $1}')
echo "[$DATE] Currently binlog: $BINLOG_FILE" >> $LOG

# 3. Backup binlog Documents
cp /var/lib/mysql/$BINLOG_FILE $BACKUP_DIR/
echo "[$DATE] binlog Backed up" >> $LOG

# 4. Long-distance transmission
rsync -avz $BACKUP_DIR/full_${DATE}.sql.gz \
  $REMOTE_HOST:$REMOTE_DIR/ >> $LOG 2>&1
echo "[$DATE] Remote transmission complete" >> $LOG

# 5. Restore Verification(In the temporary database)
mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -e "CREATE DATABASE IF NOT EXISTS verify_db;"
gunzip < $BACKUP_DIR/full_${DATE}.sql.gz | \
  mysql -u$MYSQL_USER -p$MYSQL_PASS verify_db
ROW_COUNT=$(mysql -u$MYSQL_USER -p$MYSQL_PASS \
  -N -e "SELECT COUNT(*) FROM verify_db.users;")
echo "[$DATE] Verification users Number of lines: $ROW_COUNT" >> $LOG

# 6. Clean Up the Validation Database and Expired Backups
mysql -u$MYSQL_USER -p$MYSQL_PASS -e "DROP DATABASE verify_db;"
find $BACKUP_DIR -name "full_*.sql.gz" -mtime +7 -delete
echo "=== $DATE The backup and restore process is complete ===" >> $LOG

Configure uma tarefa no crontab para ser executada às 2h da manhã todos os dias:

BASH
0 2 * * * /usr/local/bin/full_backup_restore.sh

❓ Perguntas Frequentes

P: O mysqldump bloqueia as tabelas? R: As tabelas InnoDB não são bloqueadas quando se usa o parâmetro --single-transaction; elas são lidas por meio de instantâneos de consistência MVCC. As tabelas MyISAM adquirirão bloqueios de leitura; recomenda-se fazer o backup delas fora dos horários de pico ou mudar para o XtraBackup.

P: Qual é a diferença entre o binlog e o redo log? R: O redo log é um log no nível do mecanismo InnoDB, usado para recuperação após falhas e gravado de forma circular; o binlog é um log no nível do servidor MySQL, usado para replicação mestre-escravo e recuperação em um ponto específico no tempo, gravado de forma apendicada e adequado para arquivamento. O conteúdo registrado e as finalidades dos dois são completamente diferentes.

P: Qual é o tamanho dos arquivos de backup? R: Os backups lógicos têm aproximadamente 30% a 80% do tamanho dos dados originais (em formato de texto) e cerca de 10% a 30% após a compactação com gzip. Os backups físicos têm tamanho próximo ao dos dados originais. Recomendamos reservar espaço de armazenamento equivalente a três vezes o volume dos dados.

P: Como posso verificar se o backup está em condições de uso? R: Realize periodicamente uma restauração completa em um ambiente de teste para verificar o número de tabelas, o número de linhas e os dados críticos para os negócios. Você também pode usar mysqlcheck --check para verificar as tabelas restauradas. Realize essa verificação pelo menos uma vez por mês.

P: Como faço para recuperar uma tabela que foi excluída acidentalmente? R: Restaure o backup completo mais recente em um banco de dados temporário; em seguida, use mysqlbinlog para reproduzir o binlog até o ponto imediatamente anterior à instrução DROP TABLE; e, por fim, exporte os dados da tabela excluída do banco de dados temporário e reinsira-os no banco de dados de produção.

P: secure_file_priv O que devo fazer se o caminho do OUTFILE estiver restrito? R: Defina secure_file_priv para um diretório específico (como /var/lib/mysql-files/) ou use mysql -e "SELECT ..." para redirecionar para um arquivo no lado do cliente, a fim de contornar a restrição do lado do servidor.

P: O XtraBackup afeta o desempenho durante um backup? R: Há alguma sobrecarga de E/S, mas o XtraBackup oferece o parâmetro --throttle para limitar a taxa de E/S. Recomendamos executar os backups fora dos horários de pico ou configurar o parâmetro de limitação de taxa.


📖 Resumo


📝 Exercícios

  1. Questão básica (Dificuldade: ⭐): Use mysqldump para fazer backup de um banco de dados e, em seguida, restaure-o em um novo banco de dados. Compare o número de tabelas e linhas do banco de dados original com os do banco de dados restaurado.

  2. Exercício básico (Dificuldade: ⭐): Exporte os dados de uma tabela para um arquivo CSV usando SELECT INTO OUTFILE, depois importe-os para outra tabela usando LOAD DATA INFILE e verifique se os dados correspondem.

  3. Exercício avançado (Dificuldade: ⭐⭐): Simule um cenário em que uma tabela seja excluída acidentalmente: primeiro, faça um backup completo; depois, execute algumas operações INSERT; em seguida, execute um comando DROP TABLE; por fim, use uma restauração do binlog em um ponto específico no tempo para reverter ao estado anterior ao comando DROP.

  4. Exercício avançado (Dificuldade: ⭐⭐): Escreva um script de shell para realizar automaticamente um backup diário completo, compactá-lo com o gzip, manter o backup por 7 dias e enviar uma notificação por e-mail com os resultados do backup.

  5. Questão de desafio (Dificuldade: ⭐⭐⭐): Elabore uma estratégia abrangente de backup que abranja quatro dimensões: backup completo, incremental, externo e de teste. Para um banco de dados de produção de 200 GB, especifique as ferramentas a serem utilizadas, a frequência de execução, as etapas de recuperação e os métodos de verificação.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%