Backup de MySQL
Este guia mostra como configurar backup automatizado de bancos MySQL.
Pré-requisitos
- BackupAlly instalado
- Acesso ao servidor MySQL
- Usuário com permissões de backup
Criar Usuário de Backup
Crie um usuário dedicado para backups:
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'senha-segura';
GRANT SELECT, SHOW DATABASES, LOCK TABLES, RELOAD ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;Armazenar Credenciais
backupally secrets set mysql_user "backup"
backupally secrets set mysql_password "senha-segura"Criar Task de Backup
Backup de Todos os Bancos
Crie /etc/backupally/tasks.d/mysql-prod.toml:
[task]
id = "mysql-prod"
name = "MySQL Production - All Databases"
enabled = true
schedule = "0 2 * * *"
[target]
kind = "database"
driver = "mysql"
host = "localhost"
port = 3306
database = "*"
user = "${secret:mysql_user}"
password = "${secret:mysql_password}"
excludes = ["mysql", "performance_schema", "information_schema", "sys"]
single_transaction = true
[packer]
compressor = "zstd"
compression_level = 6
[[storage]]
id = "local"
driver = "local"
path = "/backup/mysql"
retention = "daily 7, weekly 4"
[[storage]]
id = "s3"
driver = "s3"
bucket = "my-backups"
region = "us-east-1"
path = "mysql/${hostname}/${date}"
access_key = "${secret:aws_access_key}"
secret_key = "${secret:aws_secret_key}"
retention = "daily 14, weekly 8, monthly 6"MySQL em Container Docker
Não fixe o IP do container: ele muda quando o container é recriado, e o backup passa a falhar em silêncio. Declare o container:
[target]
kind = "database"
driver = "mysql"
host = "docker:mysql" # IP resolvido a cada execução
port = 3306Se o container estiver em mais de uma rede — comum quando se separa rede de aplicação e rede de dados — declare qual usar:
host = "docker:mysql/interna"Sem isso o backup falha com uma mensagem listando as redes encontradas, em vez de escolher uma no escuro. Para ver as redes do container:
docker inspect mysql --format '{{range $k,$v := .NetworkSettings.Networks}}{{$k}}={{$v.IPAddress}} {{end}}'Requer acesso ao socket do Docker pelo usuário que roda o BackupAlly.
Backup de Banco Específico
[task]
id = "mysql-app"
name = "MySQL - Application Database"
enabled = true
schedule = "0 */6 * * *"
[target]
kind = "database"
driver = "mysql"
host = "localhost"
database = "myapp"
user = "${secret:mysql_user}"
password = "${secret:mysql_password}"
single_transaction = true
[[storage]]
driver = "local"
path = "/backup/mysql/myapp"
retention = "daily 7"Banco atrás de Bastion (SSH)
Se o MySQL não é alcançável direto, adicione [target.ssh] apontando para o
bastion — o BackupAlly abre um túnel ssh -L por execução da task e fecha ao
fim. Um túnel só, mesmo com database = "*" ou modo individual.
Ver Banco atrás de Bastion (SSH) para a configuração completa.
Validar Configuração
backupally task validate mysql-prodExecutar Backup Manual
backupally backup --target mysql-prodAgendar Backup
Habilite o scheduler:
sudo systemctl enable backupally-scheduler
sudo systemctl start backupally-schedulerVerificar Execuções
backupally history --target mysql-prodRestaurar Backup
Listar Snapshots
backupally history --target mysql-prodRestaurar
backupally restore \
--target mysql-prod \
--snapshot snap_20260211_020000 \
--path /restore/mysqlImportar no MySQL
mysql -u root -p < /restore/mysql/myapp.sqlOu para banco específico:
mysql -u root -p myapp < /restore/mysql/myapp.sqlOpções Avançadas
Transação Consistente
Para garantir consistência em InnoDB:
[target]
single_transaction = true
lock_tables = falseLock de Tabelas
Para MyISAM ou tabelas mistas:
[target]
single_transaction = false
lock_tables = trueCharset Específico
[target]
charset = "utf8mb4"Monitoramento
Webhook no Slack
[notification]
enabled = true
[notification.webhook]
url = "https://hooks.slack.com/services/xxx/yyy/zzz"
method = "POST"Notificar Apenas em Erro
[notification]
enabled = true
only_on_error = trueTroubleshooting
Erro de Conexão
Verifique:
mysql -h localhost -u backup -p -e "SHOW DATABASES"Permissão Negada
Conceda permissões adicionais:
GRANT SELECT, SHOW DATABASES, LOCK TABLES ON *.* TO 'backup'@'localhost';Timeout
Aumente o timeout:
[network]
timeout_seconds = 600