Executando verificação de segurança...
17

Atualizando do MySQL 5.7 para o MySQL 8

Atualizando para o MySQL 8

No início de 2024, fui encarregado de um desafio técnico importante: atualizar todos os servidores RDS da empresa do MySQL 5.7 para o MySQL 8 em menos de dois meses. A motivação era clara — evitar um custo adicional de mais de 38 mil reais por mês.

Embora eu estivesse mais envolvido com a área de negócios naquele momento, a atualização acabou chegando até mim por conta da urgência e da minha grade experiência com administração e otimização de servidores MySQL. Alguns meses antes, já havia feito testes com o MySQL 8 e até sugerido um projeto de atualização, mas, como acontece em muitas empresas em crescimento, demandas estratégicas acabaram ganhando prioridade.

Neste artigo, quero compartilhar as principais experiências e aprendizados desse processo. Apesar do tempo limitado, conseguimos superar os desafios técnicos com planejamento, organização e trabalho em equipe. Espero que essas lições possam ajudar outros profissionais a enfrentarem projetos similares com confiança e eficiência.

Cenário

Antes de iniciar a migração, foi essencial entender o ambiente e o escopo do trabalho. Na época, a empresa possuía mais de 480 bases de dados de produção distribuídas em 7 servidores AWS RDS MySQL 5.7. Cada cliente utilizava uma base exclusiva, com estrutura complexa: 522 tabelas, 109 triggers, 101 functions, 82 procedures e 34 views por banco. Além disso, 12 bancos adicionais atendiam a aplicações internas.

O software ERP da empresa havia crescido rapidamente e, como é comum em ambientes assim, trazia legados de um desenvolvimento inicial realizado por um único programador, com várias adaptações ao longo dos anos. Isso resultou em estruturas heterogêneas entre os bancos de dados, aumentando a complexidade do projeto.

Com o levantamento do ambiente concluído, o próximo passo foi entender como esses sistemas poderiam ser otimizados e o que a atualização para o MySQL 8 ofereceria em termos de benefícios e compatibilidade.

Por que atualizar para o MySQL 8?

Com o cenário mapeado e as complexidades do ambiente identificadas, ficou claro que a migração para o MySQL 8 não era apenas uma necessidade técnica, mas uma estratégia vital para otimizar o desempenho, reduzir custos e garantir a escalabilidade do sistema. Algumas das principais razões para essa atualização foram:

  1. Evitar custos adicionais: A AWS começaria a cobrar pelo suporte estendido ao MySQL 5.7 a partir de março de 2024, o que acarretaria um custo extra de R$ 38.000 mensais. A migração para o MySQL 8 eliminaria essa despesa.
  2. Melhoria de performance e escalabilidade: O MySQL 8 traz inúmeras melhorias em termos de performance e otimização de consultas, incluindo o suporte a Window Functions e Common Table Expressions (CTEs), além de aprimoramentos no gerenciamento de memória e índices. Isso nos permitiria reduzir a carga nos servidores, melhorar o desempenho geral e preparar o ambiente para futuras expansões.
  3. Redução de servidores e custos operacionais: Com a atualização, estimamos uma significativa redução no número de servidores necessários. As melhorias no desempenho permitiriam consolidar algumas instâncias, podendo gerar uma economia de até R$ 7.000 mensais.
  4. Modernização e compatibilidade: A compatibilidade com versões mais recentes do framework .NET e os novos recursos do MySQL 8 proporcionariam uma base mais sólida para o desenvolvimento e manutenção das aplicações no longo prazo. Além disso, a possibilidade de otimizar a estrutura de dados e de criar uma base mais unificada ajudaria a reduzir os problemas de compatibilidade e performance.
  5. Benefícios indiretos para o NPS: Alguns problemas recorrentes apontados por clientes estavam relacionados à performance dos servidores. Esperávamos que a melhoria na velocidade e estabilidade das operações impactasse positivamente a satisfação dos usuários, refletindo em um aumento no NPS (Net Promoter Score) da empresa.

O processo

Nosso tempo era curto e o ambiente bastante diversificado. Precisávamos agir com rapidez e precisão, tendo como premissa básica um impacto zero nos clientes durante a atualização.

Antes de planejar as ações, rodamos a ferramenta de verificação de compatibilidade dos servidores que a própria AWS fornece em seu painel e o MySQL 8 também oferta, o Upgrade Checker. Esse utilitário é um grande aliado na migração, pois realiza uma avaliação completa do servidor e indica os principais pontos de incompatibilidade. No entanto, vale destacar que alguns pontos específicos — especialmente relacionados à aplicação — não são identificados por ele. Por isso, testes manuais são indispensáveis.

Após mapear as principais incompatibilidades, identificamos os seguintes desafios:

  • Incompatibilidade dos mais de 10 projetos .NET com a versão mais recente do conector para o MySQL 8.
  • Incompatibilidade de diversas functions, triggers e procedures nos bancos de dados.
  • Problemas na estrutura de dados, como nomes de tabelas/colunas, collation incompatíveis, tipos e tamanhos de colunas.
  • Complexidade dos testes, devido ao grande volume de dados e divergências entre eles.
  • Restrição temporal para concluir o projeto.
  • Erros abstratos não identificados pelo Upgrade Checker.
  • Tabelas corrompidas que impediam a conversão de alguns servidores.

Com base nisso, traçamos uma estratégia meticulosa para garantir uma transição segura e com impacto zero nos clientes. As etapas mais importantes foram:

  1. Definir prioridades: Os servidores dos clientes foram priorizados, pois representavam 90% dos custos e eram mais compatíveis entre si. E caso não conseguíssemos finalizar o projeto dentro do esperado, teríamos um custo menor com os servidores que faltariam converter.
  2. Ambiente de testes: Criamos uma réplica de um servidor para realizar testes. Depois de obter uma versão funcional, repetimos todo o processo para garantir que a documentação estava completa e funcional.
  3. Refatorar projetos: A equipe de desenvolvimento foi essencial para resolver os problemas de compatibilidade do conector e ajustar consultas que quebravam no MySQL 8. A grande conquista aqui foi conseguir um conector que funcionasse bem nas duas versões.
  4. Substituir de algumas triggers por serviços de mensageria: Substituímos algumas das triggers mais complexas e lentas por funções Lambda e serviços de mensageria, como o Amazon SQS. Com isso, conseguimos transferir uma enorme carga dos servidores para as funções, além de aproveitar outros benefícios proporcionados por esse tipo de arquitetura. Essa é uma excelente estratégia para tirar regra de negócio de bancos de dado e diminuir a carga de trabalho dos servidores.
  5. Expandir os testes: Após conseguirmos criar um ambiente sólido em um servidor de testes, replicamos todo o processo em réplicas de todos os servidores para garantir que a migração ocorreria como esperado.
  6. Cronograma adequado: Primeiro, migramos um servidor e o monitoramos por duas semanas. Isso nos permitiu identificar alguns problemas que passaram nos testes.
  7. Migração durante a madrugada: A migração completa foi realizada de madrugada, minimizando o impacto nos clientes.
  8. Monitoramento constante: Verificamos continuamente os logs do sistema e dos servidores após a migração.

Resultados obtidos

A atualização para o MySQL 8 trouxe melhorias significativas, não apenas no desempenho dos servidores, mas também no custo operacional e na estabilidade geral do ambiente. Entre os benefícios alcançados, destaco:

  • Economia mensal de R$ 38 mil: Pela eliminação do suporte estendido da AWS.
  • Redução de 60% no consumo de memória RAM: As otimizações reduziram em 60% o uso de memória, permitindo reduzir nossas instâncias pela metade.
  • Redução do uso de CPU em 35%: Além das melhorias nativas do MySQL 8, a remoção de triggers e procedures foi decisiva para essa redução.
  • Redução de custos operacionais: As otimizações realizadas pela equipe, somadas às vantagens do MySQL 8, possibilitaram o uso de servidores menores e a consolidação de outros. O impacto financeiro é uma economia média mensal de 12 mil reais, chegando a 144 mil anuais.
  • Otimização das taxas de transferência: Atualizamos o sistema de armazenamento das instâncias de 160 MB/s para 1.000 MB/s usando o gp3.
  • Melhor compatibilidade: Permite atualizações futuras no framework das aplicações.
  • Melhorias consideráveis no desempenho: Processos mais eficientes de gestão de caches, otimização de threads, maior eficiência nas tabelas e aumento na velocidade das consultas.
  • Otimizações das consultas com os novos recursos: Com as funções de janela e CTEs foi possível otimizar uma série de consultas.
  • Aprimoramentos gerais: Segurança, normalização de triggers e funções, e remoção de bases obsoletas.

Esses resultados não só atenderam nossas necessidades imediatas, mas também estabeleceram uma base sólida para aprimoramentos futuros nos servidores e aplicações.

Dicas para projetos semelhantes

Este projeto foi bastante desafiador e evidenciou a importância de um planejamento detalhado e execução cuidadosa para evitar indisponibilidades nos sistemas. Com base na experiência, compartilho algumas dicas fundamentais:

  • Monte um ambiente de testes: Embora criar um ambiente de testes possa gerar custos adicionais, ele é crucial para evitar interrupções nas suas aplicações. Após configurá-lo e garantir seu funcionamento, replique-o em outro ambiente de testes e, somente depois, implemente em produção.
  • Realize testes manuais: Apesar de existirem utilitários que ajudam a mapear incompatibilidades, cada ambiente é único e possui suas especificidades. Em nosso caso, identificamos diversos pontos que precisaram de ajustes manuais, pois os utilitários não foram capazes de prever essas particularidades.
  • Cuidado com as variáveis do MySQL: Algumas variáveis se tornaram obsoletas e outras tiveram seus valores padrão alterados. Identificamos problemas apenas após a migração, como nas variáveis lower_case_table_names, character_set_server, character_set_connection e sql_mode.
  • Revise o uso de palavras reservadas: Certifique-se de que nomes de tabelas e colunas não utilizem palavras reservadas, para evitar problemas futuros.
  • Simplifique o momento da conversão: Antes de migrar o servidor, remova todas as triggers, functions, procedures, events e views. Isso simplificará o processo, permitindo lidar separadamente com erros relacionados a esses objetos. Não se esqueça de realizar backups antes de excluí-los.
  • Atenção a erros abstratos: Durante a migração, enfrentamos dificuldades com tabelas "fantasmas" e corrompidas. Como utilizávamos o AWS RDS, foi necessário recorrer ao suporte técnico para solucionar esses problemas.
  • Atualize as collections dos bancos de dados: A migração é uma oportunidade para atualizar as codificações dos bancos, mas fique atento ao tamanho das linhas. O MySQL tem um limite de 65.535 bytes por linha, e colunas do tipo VARCHAR em utf8mb4 podem ocupar até quatro vezes mais espaço do que em latin1. Apesar do trabalho adicional, a atualização é altamente recomendada, já que espaço de armazenamento raramente é um problema nos dias de hoje, especialmente com o MySQL 8.
  • Reveja as variáveis do novo ambiente: A mudança do MySQL 5.7 para o 8 traz mudanças significativas no funcionamento. Ajustes finos nas variáveis são necessários para aproveitar ao máximo o novo ambiente.
  • Foque nos resultados ao buscar aprovação: Em apresentações para obtenção de aprovação do projeto, priorize os resultados esperados e não as ações técnicas. Destaque as vantagens financeiras e os impactos positivos para o negócio que serão alcançados com a implementação.

Conclusão

A migração do MySQL 5.7 para o MySQL 8 foi um desafio técnico significativo, mas também uma oportunidade para demonstrar como um planejamento detalhado, combinado com a experiência prática, pode gerar resultados concretos e valiosos para a empresa. Ao longo deste processo, conseguimos não apenas alcançar os objetivos financeiros e de performance, mas também estabelecer uma base sólida para a evolução contínua das operações e das aplicações.

Projetos como esse exigem não apenas conhecimento técnico, mas também uma visão estratégica, capacidade de adaptação e uma abordagem cuidadosa para lidar com os desafios imprevistos. Abordagens como essa são essenciais para ajudar empresas a enfrentarem transformações tecnológicas complexas com confiança, otimizando recursos e, principalmente, garantindo a continuidade dos negócios.

Espero que as experiências e aprendizados compartilhados aqui possam servir como um guia prático para aqueles que estão planejando ou iniciando uma migração semelhante. Com a abordagem certa, é possível transformar desafios em oportunidades de melhoria e crescimento para a empresa e para a equipe.

Carregando publicação patrocinada...
2

Passamos por isso aqui também em 2024. Com o fim do suporte da AWS, os custos ficariam muito altos com o suporte extendido. Foram dois meses de preparação. Os testes foram imprescindíveis. Encontramos muitos pontos de falhas por conta que o projeto era legado, com mais de 12 anos desde a sua primeira versão.

Mas a economia e a melhoria de desempenho foram notórios. Valeu a pena o trabalho.

Vou revisar o projeto baseado nos ajustes descritos no artigo pra ver se conseguimos melhorar ainda mais o que já ficou bom.

Parabéns pelo artigo!

1

De fato a diferença do mysql 5.7 para o 8 é enorme! Acredito que essa migração embora tenha sido forçada foi muito boa, pois abriu espaço para realizar normatizações no banco e organizar a casa. Embora a migração tenha ocorrido num período tão curto, os ajustes feitos para permitir a migração devem ter sido de grande valor no desempenho dos servidores após migração.
Um desafio enorme como esse requer de fato um bom planejamento, e equipe engajada.

Acredito que esse material será de grande valor para pessoas que tenham que enfrentar esse tipo de migração no futuro.

Parabéns pelo material 👏

0

Belo artigo, com dados, procedimentos e até valores envolvidos. Muitas vezes postergamos migrações desta natureza e acumulamos débitos técnicos devido a ausência de maneiras para comprovar aos superiores a necessidade de fazer estas atualizações. Este artigo com certeza serve como base, não só técnica, mas também para apoiar estudos de viabilidade nesse sentido.

Vale a pena até lançar uma versão em inglês 🙂

0

A verdade é que, se já existisse um material como este quando você estava estudando a melhor abordagem, aposto que sua ação teria sido muito mais direcionada e menos árdua. O material está excelente, parabéns, Gabriel!

-6

Parabéns pelo artigo, Gabriel! A forma detalhada como você compartilhou os desafios e as soluções enfrentadas no processo de migração do MySQL 5.7 para o MySQL 8 é inspiradora e informativa. As dicas, como o uso do Upgrade Checker e o cuidado com as variáveis do ambiente, são extremamente práticas e aplicáveis a diversos contextos.

Sem dúvidas, seu artigo se torna uma leitura essencial para quem deseja realizar uma migração complexa com planejamento e eficiência, garantindo resultados sólidos e impacto mínimo nos sistemas.

-7

Excelente descrição do processo de migração! Fica claro como o planejamento detalhado foi crucial para evitar impactos nos clientes. A solução criativa de substituir triggers por serviços de mensageria, como Amazon SQS e AWS Lambda, destacou-se ao reduzir a carga dos servidores e modernizar a arquitetura, assim como o fato de optar pela migração em horários de baixo volume de atividade dos clientes (madrugada).

As dicas práticas — especialmente sobre testes manuais e ajustes nas variáveis do MySQL — são valiosas para quem enfrenta desafios semelhantes. Parabéns pela execução eficiente e pelos resultados alcançados!