kb.erickguedes.com
MySQL: Administração e Performance

Backup e Restore

Aula 3 de 6

mysqldump

# Backup completo
mysqldump -u root -p --all-databases > full_backup.sql
mysqldump -u root -p --databases db1 db2 > multi_db.sql
mysqldump -u root -p meu_banco > meu_banco.sql

# Apenas estrutura
mysqldump -u root -p --no-data meu_banco > schema.sql

# Apenas dados
mysqldump -u root -p --no-create-info meu_banco > dados.sql

# Comprimir
mysqldump -u root -p meu_banco | gzip > backup.sql.gz

# Restore
mysql -u root -p < full_backup.sql
mysql -u root -p meu_banco < meu_banco.sql
gunzip < backup.sql.gz | mysql -u root -p meu_banco

# Opções importantes
mysqldump \
  --single-transaction \     # consistent read (InnoDB, sem lock)
  --routines \               # stored procedures
  --triggers \               # triggers
  --events \                 # events
  --hex-blob \               # BLOBs em hex
  --quick \                  # não bufferizar em memória
  meu_banco > backup.sql

Percona XtraBackup (Hot Backup)

# Instalação
sudo apt install percona-xtrabackup-80

# Backup full (sem parar MySQL)
xtrabackup --backup --target-dir=/backup/mysql/full/

# Prepare (aplica redo log)
xtrabackup --prepare --target-dir=/backup/mysql/full/

# Restore
systemctl stop mysql
rm -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/mysql/full/
chown -R mysql:mysql /var/lib/mysql
systemctl start mysql

# Backup incremental
xtrabackup --backup --target-dir=/backup/mysql/inc1/ \
  --incremental-basedir=/backup/mysql/full/

xtrabackup --prepare --apply-log-only --target-dir=/backup/mysql/full/
xtrabackup --prepare --target-dir=/backup/mysql/full/ \
  --incremental-dir=/backup/mysql/inc1/

# Compressão
xtrabackup --backup --compress --compress-threads=4 --target-dir=/backup/mysql/

Point-in-Time Recovery (PITR)

# 1. Backup full + binlogs
mysqldump --single-transaction --flush-logs --master-data=2 meu_banco > base.sql

# 2. Restaurar base
mysql -u root -p meu_banco < base.sql

# 3. Aplicar binlogs até o momento desejado
mysqlbinlog binlog.000012 binlog.000013 \
  --start-datetime="2024-06-01 14:30:00" \
  --stop-datetime="2024-06-01 15:45:00" \
  | mysql -u root -p

# --stop-position: parar em posição específica (PITR preciso)
mysqlbinlog binlog.000012 --stop-position=1234567 | mysql -u root -p

Backup Automation

#!/bin/bash
# /usr/local/bin/mysql-backup.sh
BACKUP_DIR="/backup/mysql/$(date +%Y-%m-%d)"
mkdir -p "$BACKUP_DIR"

# Backup full
xtrabackup --backup --target-dir="$BACKUP_DIR/full" 2>> /var/log/xtrabackup.log

# Prepare
xtrabackup --prepare --target-dir="$BACKUP_DIR/full" 2>> /var/log/xtrabackup.log

# Compactar
tar czf "$BACKUP_DIR.tar.gz" -C "$BACKUP_DIR" .
rm -rf "$BACKUP_DIR"

# Limpar backups antigos (> 30 dias)
find /backup/mysql/ -name "*.tar.gz" -mtime +30 -delete

# Enviar para S3 (opcional)
aws s3 cp "$BACKUP_DIR.tar.gz" s3://mysql-backups/$(date +%Y/%m/%d)/
# Cron: 0 2 * * * /usr/local/bin/mysql-backup.sh

Estratégias de Backup

TipoRPORTOFerramenta
mysqldump1 diaHorasmysqldump
Full + incremental15 min1-2hXtraBackup
Replica (read-only)Quase 0MinutosReplicação
PITRQualquer pontoVariávelBinlogs

Lab: Rotina de Backup

#!/bin/bash
set -euo pipefail

BACKUP_DIR="/backup/mysql/$(date +%Y-%m-%d_%H-%M)"
LOG="/var/log/mysql-backup.log"
RETENTION_DAYS=30

log() { echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> "$LOG"; }

log "Iniciando backup..."

# Backup full com XtraBackup
xtrabackup --backup --target-dir="$BACKUP_DIR" >> "$LOG" 2>&1
xtrabackup --prepare --target-dir="$BACKUP_DIR" >> "$LOG" 2>&1

# Compactar
tar czf "${BACKUP_DIR}.tar.gz" -C "$(dirname $BACKUP_DIR)" "$(basename $BACKUP_DIR)"
rm -rf "$BACKUP_DIR"

# Limpar antigos
find /backup/mysql/ -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete

log "Backup concluído: ${BACKUP_DIR}.tar.gz"

mysqldump: backup lógico, portável, lento. XtraBackup: físico, rápido, hot backup. PITR: restaura para qualquer segundo. Estratégia: full semanal + incremental diário + binlog contínuo.