Migrar do MySQL para o MariaDB: o guia que eu queria ter lido antes
Como migrar do MySQL 5.7 ou 8.x para o MariaDB com segurança: escolha de versão, incompatibilidades reais (JSON, collations, autenticação), dump, validação e virada com replicação.

"MariaDB é só trocar o binário, né?" Já foi. Do MySQL 5.5 para o MariaDB 5.5 era quase isso. Hoje, com o MySQL 8 e o MariaDB 11/12, são dois bancos irmãos que cresceram em direções diferentes. A migração continua tranquila, mas não é cega. Aqui vai o roteiro que eu uso.
Passo 0: para qual versão?
Produção pede versão com suporte longo (LTS). Expliquei as opções em MariaDB 10.6 chegou ao fim de vida: para qual versão migrar?. Resumo: escolha uma LTS ativa e evite rolling releases em sistema crítico.
O mapa da migração
1. Inventário → versões, tamanho, features usadas
2. Compatibilidade → JSON, collations, auth, SQL específico
3. Ensaio → dump/restore em homologação + testes da aplicação
4. Sincronização → MariaDB como réplica do MySQL
5. Virada → para escrita, aponta a aplicação, monitora
6. Rollback pronto → plano B testado
Passo 1: inventário
SELECT VERSION();
SELECT table_schema, engine, COUNT(*) tabelas,
ROUND(SUM(data_length+index_length)/1024/1024) mb
FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','sys','information_schema','performance_schema')
GROUP BY table_schema, engine;
-- colunas JSON (atenção especial)
SELECT table_schema, table_name, column_name
FROM information_schema.columns WHERE data_type = 'json';
-- collations do MySQL 8
SELECT DISTINCT table_collation FROM information_schema.tables
WHERE table_collation LIKE '%0900%';
Passo 2: as incompatibilidades que mordem
Vindo do MySQL 5.7
Geralmente o caminho mais suave. O MariaDB nasceu desse código e a maioria das aplicações roda sem mudança. Ainda assim, faça o ensaio.
Vindo do MySQL 8.x
- Arquivos de dados não são compatíveis. Esqueça copiar o datadir. Do MySQL 8 a migração é lógica (dump e restore).
- JSON: no MySQL é um tipo binário; no MariaDB,
JSONé um alias paraLONGTEXTcom validaçãoJSON_VALID. As funções JSON comuns existem nos dois, mas teste as consultas que usam operadores->e->>e índices em colunas geradas. - Collations
utf8mb4_0900_*: padrão do MySQL 8. Versões recentes do MariaDB reconhecem esses nomes e mapeiam para equivalentes; em versões antigas o restore falha. Na dúvida, troque no dump. - Autenticação
caching_sha2_password: padrão do MySQL 8. Confira o suporte na versão de MariaDB escolhida; o caminho mais simples é recriar os usuários no destino com o plugin nativo do MariaDB. - Diferenças de SQL e otimizador: consultas com hints específicos do MySQL e algumas funções novas podem se comportar diferente. Só teste com a carga real revela.
Passo 3: dump e restore
# no MySQL de origem (sem as bases de sistema)
mysqldump --single-transaction --routines --triggers --events \
--databases loja financeiro > dump.sql
# se o destino não aceitar as collations 0900
sed -i 's/utf8mb4_0900_ai_ci/utf8mb4_unicode_ci/g' dump.sql
# no MariaDB de destino
mariadb < dump.sql
Não leve o schema mysql no dump: as tabelas de usuários e privilégios são diferentes. Exporte as permissões e recrie:
-- na origem, para cada usuário
SHOW GRANTS FOR 'app'@'%';
-- no destino
CREATE USER 'app'@'%' IDENTIFIED BY 'senha_forte';
GRANT SELECT, INSERT, UPDATE, DELETE ON loja.* TO 'app'@'%';
Base grande? Use ferramentas paralelas de dump lógico (como o mydumper) para não passar o fim de semana olhando barra de progresso.
Passo 4: validar antes de comemorar
-- contagem de linhas por tabela, nos dois lados
SELECT COUNT(*) FROM loja.pedidos;
-- checksum (compare origem e destino)
CHECKSUM TABLE loja.pedidos, loja.clientes;
E o mais importante: rode a suíte de testes da aplicação e as consultas mais pesadas, capturadas do slow log, contra o MariaDB. Compare tempos e planos com EXPLAIN.
Passo 5: virada com pouca parada
Para não parar o sistema durante o restore, configure o MariaDB como réplica do MySQL a partir da posição registrada no dump. A replicação MySQL → MariaDB é suportada em vários cenários, mas confira a combinação exata de versões e use o formato de binlog ROW. Quando a réplica alcançar a origem:
- Coloque a aplicação em modo leitura (ou pare a escrita).
- Confirme que a réplica está sem atraso.
- Pare a replicação e aponte a aplicação para o MariaDB.
- Monitore erros e latência nas primeiras horas.
Passo 6: rollback
Migração sem plano de volta é aposta. Guarde o MySQL original intacto até ter certeza, e decida antes qual é o critério para voltar (erro X, latência acima de Y).
E depois? Aproveite o que o MySQL não tem
Migrou? Agora vem a parte divertida: tabelas temporais, SEQUENCE, RETURNING, thread pool gratuito, Galera Cluster e vetores para IA. Está tudo em /mariadb.
Sobre o autor: Alexandre Almeida é MariaDB Ambassador no Brasil, autor do livro Aprendendo MySQL e trabalha com bancos de dados há mais de 30 anos.
Fontes: MariaDB Knowledge Base: Moving from MySQL to MariaDB, MariaDB versus MySQL Compatibility, JSON Data Type e Replication Compatibility (mariadb.com/kb). Documentação do MySQL 8.4: mysqldump e Authentication Plugins. Imagem: ilustração gerada por IA.