Como fazer backup de MySQL e MariaDB sem corromper: mariadb-dump, mysqldump, mariadb-backup e XtraBackup, com agendamento, restauração e testes.
Para que serve
Copiar a pasta /var/lib/mysql com o banco ligado gera um backup que muitas vezes não sobe. Este artigo mostra os dois jeitos corretos de fazer backup de MySQL e MariaDB: o backup lógico (um arquivo SQL, portátil entre versões, ideal até algumas dezenas de GB) e o backup físico a quente (cópia consistente dos arquivos de dados, muito mais rápida para bancos grandes). Os comandos valem para MariaDB 10.11/11.x (Debian 12/13, Ubuntu 24.04) e MySQL 8.0/8.4.
Pré-requisitos
- Acesso root ao servidor ou à VM onde o banco roda.
- Espaço livre em disco para ao menos um backup completo, de preferência em outro volume.
- Saber se as tabelas são InnoDB (quase sempre). Tabelas MyISAM não têm cópia consistente sem travamento.
mariadb, mariadb-dump e mariadb-backup. Os nomes antigos mysqldump e mariabackup podem não existir nas versões 11.x. No MySQL 8.4, o mysqlpump foi removido; use mysqldump ou o MySQL Shell.Opção 1: backup lógico com mariadb-dump / mysqldump
-
Credenciais. No Debian e no Ubuntu, o root do sistema entra no MariaDB pelo socket sem senha. Se o seu servidor exige senha, crie
/root/.my.cnf:[client] user=root password=SUA_SENHAchmod 600 /root/.my.cnf -
Teste um dump manual de um banco.
mariadb-dump --single-transaction --routines --triggers --events \ --hex-blob --default-character-set=utf8mb4 meubanco | zstd -q > /var/backups/meubanco.sql.zstA opção
--single-transactionlê tudo dentro de uma única transação: o dump sai consistente sem travar as tabelas InnoDB. No MySQL, troquemariadb-dumppormysqldump; as opções são as mesmas. Instale ozstdcomapt install zstdse necessário. -
Automatize um arquivo por banco. Arquivos separados permitem restaurar um único banco sem tocar nos outros. Crie
/usr/local/sbin/dump-mariadb.sh:#!/bin/bash set -euo pipefail DEST=/var/backups/mysql DATA=$(date +%F_%H%M) mkdir -p "$DEST" for db in $(mariadb -N -e "SHOW DATABASES" | grep -Ev '^(information_schema|performance_schema|sys|mysql)$'); do mariadb-dump --single-transaction --routines --triggers --events \ --hex-blob --default-character-set=utf8mb4 "$db" | zstd -q > "$DEST/${db}_${DATA}.sql.zst" done # usuarios e permissoes (MariaDB 10.11+) mariadb-dump --system=users | zstd -q > "$DEST/_usuarios_${DATA}.sql.zst" # mantem 7 dias localmente find "$DEST" -name '*.sql.zst' -mtime +7 -deletechmod 700 /usr/local/sbin/dump-mariadb.sh echo '0 1 * * * root /usr/local/sbin/dump-mariadb.sh' > /etc/cron.d/dump-mariadbPara entender o agendamento, veja também o artigo «Como agendar tarefas no Linux com cron e com systemd timers».
No MySQL não existe
--system=users. Exporte os usuários com o MySQL Shell (util.dumpInstanceinclui contas) ou gere os comandos comSHOW CREATE USEReSHOW GRANTS. -
Leve a cópia para fora do servidor com restic ou rclone (veja os artigos desta categoria), agendando-os depois do dump.
Restaurar um dump
mariadb -e "CREATE DATABASE meubanco_teste CHARACTER SET utf8mb4"
zstd -dc /var/backups/mysql/meubanco_2026-10-08_0100.sql.zst | mariadb meubanco_teste
Restaurar com outro nome permite conferir os dados antes de substituir o banco de produção. Se o banco roda em uma VM, veja também o artigo «Banco de dados em VM no Proxmox: disco, cache e ZFS (volblocksize, recordsize e sync)».
Opção 2: backup físico a quente (bancos grandes)
Para bancos acima de 30 a 50 GB, o dump e principalmente a restauração (que reconstrói todos os índices) ficam lentos. O backup físico copia os arquivos InnoDB enquanto o banco funciona e depois os deixa consistentes.
MariaDB: mariadb-backup
-
Instale o pacote da mesma versão do servidor e faça o backup:
apt install -y mariadb-backup mariadb-backup --backup --target-dir=/var/backups/mariadb-full/$(date +%F) -
Prepare o backup (aplica o log de transações e deixa os arquivos prontos para uso). Faça isso logo após o backup, não na hora do desastre:
mariadb-backup --prepare --target-dir=/var/backups/mariadb-full/2026-10-08 -
Para restaurar, o diretório de dados precisa estar vazio e o serviço parado:
systemctl stop mariadb mv /var/lib/mysql /var/lib/mysql.antigo mkdir /var/lib/mysql mariadb-backup --copy-back --target-dir=/var/backups/mariadb-full/2026-10-08 chown -R mysql:mysql /var/lib/mysql systemctl start mariadb
O mariadb-backup também faz backups incrementais (--incremental-basedir), úteis quando o banco é grande e muda pouco.
MySQL 8.0/8.4: Percona XtraBackup ou MySQL Shell
- Percona XtraBackup é o equivalente para MySQL:
xtrabackup --backup --target-dir=..., depoisxtrabackup --prepareextrabackup --copy-back. A série do XtraBackup deve acompanhar a do servidor (8.0 para MySQL 8.0, 8.4 para MySQL 8.4). - MySQL Shell (
mysqlsh) faz dumps lógicos em paralelo, bem mais rápidos que o mysqldump:util.dumpInstance("/var/backups/mysqlsh")e, para restaurar,util.loadDump(...).
Recuperação até um ponto no tempo
Se o RPO precisa ser menor que o intervalo entre dumps, ative o log binário (log_bin) e guarde os arquivos de binlog junto com o backup. Na restauração, você volta o último backup completo e reaplica os binlogs até o minuto anterior ao problema com mariadb-binlog (ou mysqlbinlog). Registre a posição do binlog no dump com --master-data=2 no MariaDB ou --source-data=2 no MySQL.
Como testar o backup de MySQL e MariaDB
- Os arquivos do dia existem e não estão vazios:
ls -lh /var/backups/mysql. - O dump termina com a linha de conclusão:
zstd -dc ARQUIVO | tail -1deve mostrar-- Dump completed on .... - Uma vez por mês, restaure em um banco de teste e compare a contagem de linhas das principais tabelas com a produção.
Problemas comuns
"Got packet bigger than max_allowed_packet"
Há registros grandes (BLOBs). Acrescente --max-allowed-packet=1G no dump e ajuste a mesma variável no servidor de destino da restauração.
Restauração em outra versão falha com erro de collation
Dumps do MySQL 8 usam utf8mb4_0900_ai_ci, que versões mais antigas do MariaDB não reconhecem. Ao migrar de MySQL para MariaDB, substitua a collation no arquivo ou converta para utf8mb4_unicode_ci antes.
mariadb-backup reclama de versão
O mariadb-backup precisa ser da mesma versão do servidor. Atualize os dois juntos e faça um backup completo novo após cada atualização de versão principal.
Dump trava a aplicação
Provavelmente há tabelas MyISAM ou o dump foi feito sem --single-transaction. Converta as tabelas para InnoDB ou agende o dump para a madrugada.
Perguntas frequentes
Posso copiar a pasta /var/lib/mysql como backup?
Não com o banco ligado: a cópia sai inconsistente e muitas vezes não sobe. Use um dump lógico ou o backup físico a quente com mariadb-backup ou XtraBackup.
Qual a diferença entre mysqldump e mariadb-dump?
São a mesma ferramenta com nomes diferentes. No MariaDB o nome atual é mariadb-dump, e o antigo pode não existir nas versões 11.x; no MySQL continua mysqldump.
O mysqldump trava as tabelas?
Com --single-transaction, tabelas InnoDB não são travadas e o dump sai consistente. Tabelas MyISAM continuam sendo um problema; converta-as para InnoDB.
Quando usar backup físico em vez de dump?
Em bancos acima de 30 a 50 GB, quando o dump e principalmente a restauração ficam lentos demais para o RTO do negócio.
Como restaurar o banco até um horário específico?
Ative o log binário, restaure o último backup completo e reaplique os binlogs até o minuto anterior ao problema com mariadb-binlog ou mysqlbinlog.
Leitura complementar
- MariaDB: backup completo e restauração com mariadb-backup
- MySQL 8.4: mysqldump
- Percona XtraBackup 8.4
Precisa de ajuda?
Se o backup ou a restauração do banco der erro, abra um ticket na área do cliente com a mensagem completa e a versão do banco (mariadb --version ou mysql --version).
