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
| Tipo | RPO | RTO | Ferramenta |
|---|---|---|---|
| mysqldump | 1 dia | Horas | mysqldump |
| Full + incremental | 15 min | 1-2h | XtraBackup |
| Replica (read-only) | Quase 0 | Minutos | Replicação |
| PITR | Qualquer ponto | Variável | Binlogs |
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.